2010-12-05 59 views
2

我有一個SQL查詢是這樣的:在SELECT和ORDER BY中COUNT是否執行兩次?

SET @q = 
(SELECT Id AS '@Id', COUNT(Occ) AS '@Occ' FROM Details 
GROUP BY Id 
ORDER BY COUNT(Occ) DESC, Id ASC 
FOR XML PATH('Data'), ROOT('Stats'), ELEMENTS, TYPE) 

我設置AS @Id和AS @Occ爲了我的FOR XML指令的屬性,而不是元素轉換輸出。

我的問題:COUNT(Occ)在SELECT和ORDER BY中出現的次數是否會導致計數被執行兩次,如果是這樣,我該如何防止這種情況發生?

謝謝!

回答

3

較早版本的SQL要求出現在ORDER BY子句中的任何表達式必須與SELECT子句中的某一列完全相同。這是爲了表達式不必被評估兩次。只要你在兩個地方都有完全相同的表達式,就不需要執行兩次。

實際上,您的排序可以寫爲ORDER BY 2 DESC, 1,因爲您可以使用基於1的列號而不必複製表達式。無論使用哪種方式,表達式都不應執行兩次。

0

通過查看執行計劃,您可以清楚地看到SQL如何執行查詢。可能不會計算兩次,但可能取決於優化程序是否認爲效率更高。在那種情況下,我不會試圖阻止它。

0

在'Bad Old Days'(SQL-86)中,您必須使用'ORDER BY 2 DESC, 1 ASC',指定您想要訂購數據的列號。這很icky,所以後來的版本允許你指定相關的表達式進行排序。但是優化器仍然不會重新計算實際值。它必須知道計算的值才能進行排序(並且不要忘記,它可能需要將給定輸出行的值與其他輸出行的值進行多次比較)。

相關問題