2010-12-05 3 views
2

У меня есть SQL-запрос, как это:Выполняет ли COUNT два раза, когда в SELECT и ORDER BY?

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», указав номера столбцов, по которым вы хотите заказать данные. Это довольно неприятно, поэтому более поздние версии позволяют указывать соответствующие выражения для сортировки. Но оптимизатор по-прежнему не собирается повторно вычислять фактические значения во второй раз. Он должен знать вычисленное значение для сортировки (и не забывайте, что ему, возможно, придется сравнивать значение для данной выходной строки со значениями для других выходных строк много раз, как это делает сортировка).