Sql 在SELECT和ORDER BY中,计数是否执行两次?
我有这样一个SQL查询:Sql 在SELECT和ORDER BY中,计数是否执行两次?,sql,sql-server,sqlxml,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) 我将设置为@Id和@Occ,以便for-XML指令将输出转换为属性而不是元素 我的问题:SELECT和ORDER BY中计数(Occ)的双重
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)
我将设置为@Id和@Occ,以便for-XML指令将输出转换为属性而不是元素
我的问题:SELECT和ORDER BY中计数(Occ)的双重出现是否会导致计数执行两次,如果是,如何防止这种情况发生
谢谢 通过查看执行计划,您可以确切地看到SQL是如何执行查询的。它可能不会计数两次,但这可能取决于优化器是否认为这会更有效。在这种情况下,我不会试图阻止它。在“糟糕的旧时光”(SQL-86)中,您必须使用“
按2 DESC,1 ASC排序”
”,指定要按其排序数据的列号。这很讨厌,所以以后的版本允许您指定要排序的相关表达式。但是优化器仍然不会再次重新计算实际值。它必须知道计算出的值才能进行排序(别忘了,在排序时,它可能需要将给定输出行的值与其他输出行的值进行多次比较).较旧版本的SQL要求出现在ORDER BY
子句中的任何表达式必须与SELECT
子句中的一列完全相同。这样就不必对表达式求值两次。只要在两个位置都有完全相同的表达式,就不必执行两次
事实上,您的排序可以写成orderby2desc,1
,因为您可以只使用基于1的列编号,而不必复制表达式。无论使用哪种方式,表达式都不应执行两次