在SELECT和ORDER BY中COUNT是否执行两次?

时间:2010-12-05 06:24:44

标签: sql sql-server sqlxml

我有一个像这样的SQL查询:

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指令将输出转换为属性而不是元素。

我的问题:SELECT和ORDER BY中COUNT(Occ)的重复出现是否导致计数执行两次,如果是,我该如何防止这种情况发生?

谢谢!

3 个答案:

答案 0 :(得分:4)

旧版本的SQL要求ORDER BY子句中出现的任何表达式必须与SELECT子句中的一列完全相同。这样就不必对表达式进行两次评估。只要你在两个地方都有完全相同的表达式,它就不必执行两次。

实际上,您的排序可以写为ORDER BY 2 DESC, 1,因为您只需使用基于1的列号而不必复制表达式。无论您使用哪种方式,表达式都不应执行两次。

答案 1 :(得分:0)

通过查看执行计划,您可以确切了解SQL如何执行查询。可能它不会计算两次,但可能取决于优化器是否认为更有效。在这种情况下,我不会试图阻止它。

答案 2 :(得分:0)

在“Bad Old Days”(SQL-86)中,您必须使用“ORDER BY 2 DESC, 1 ASC”,指定要用于订购数据的列号。这非常狡猾,因此以后的版本允许您指定要排序的相关表达式。但优化器仍然不会再次重新计算实际值。它必须知道进行排序的计算值(并且不要忘记,它可能需要将给定输出行的值与其他输出行的值进行多次比较)。