COUNT выполняется дважды в SELECT и ORDER BY? - PullRequest
2 голосов
/ 05 декабря 2010

У меня есть 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 преобразовывала выходные данные как атрибуты, а не элементы.

Мой вопрос: двойное вхождение COUNT (Occ) как в SELECT, так и в ORDER BY приводит к тому, что счет выполняется дважды, и если да, как я могу предотвратить это?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 05 декабря 2010

В более старых версиях SQL требовалось, чтобы любое выражение, появляющееся в предложении ORDER BY, было точно таким же, как один из столбцов в предложении SELECT. Это было так, что выражения не нужно было оценивать дважды. Пока у вас есть одно и то же выражение в обоих местах, его не нужно будет выполнять дважды.

Фактически, ваш вид может быть записан как ORDER BY 2 DESC, 1, потому что вы можете просто использовать номер столбца на основе 1 вместо того, чтобы копировать выражение. Какой бы способ вы ни использовали, выражение не должно выполняться дважды.

0 голосов
/ 05 декабря 2010

В «Плохие старые дни» (SQL-86) вам пришлось бы использовать «ORDER BY 2 DESC, 1 ASC», указав номера столбцов, по которым вы хотите упорядочить данные. Это довольно странно, поэтому в более поздних версиях вы можете указать соответствующие выражения для сортировки. Но оптимизатор все равно не собирается пересчитывать фактические значения во второй раз. Он должен знать вычисленное значение, чтобы выполнить сортировку (и не забывайте, что может потребоваться сравнить значение для данной выходной строки со значениями для других выходных строк много раз, как это делает сортировка).

0 голосов
/ 05 декабря 2010

Вы можете точно увидеть, как SQL выполняет запрос, посмотрев план выполнения.Вероятно, он не будет учитываться дважды, но это может зависеть от того, считает ли оптимизатор, что это будет более эффективно.В таком случае я бы не стал его останавливать.

...