Когда я использую вычисление или подзапрос в моем предложении ORDER, который уже находится в моем предложении SELECT, знает ли SQL, чтобы просто заказать этот столбец? Или он пересчитывает все для каждой строки при сортировке?Вызывает ли предложение Order By значение в SQL Server?
Например, позволяет сказать, что я пишу страшный запрос, как это:
SELECT EmployeeName, (SELECT COUNT(*) FROM Employee e2 WHERE MgrID = Employee.EmployeeID)
FROM Employee
ORDER BY (SELECT COUNT(*) FROM Employee e2 WHERE MgrID = Employee.EmployeeID)
Да, я знаю, как написать этот запрос лучше, и я знаю, как использовать порядковые в моем заказе по-- но что, если я этого не сделаю? Будет ли SQL перезагружать этот подзапрос для каждой строки или он знает, что он может использовать значение уже в столбце 2?
Как насчет заказа на столбец, который использует функцию?
SELECT EmployeeName, LTRIM(RTRIM(BranchName)) FROM Employee
ORDER BY LTRIM(RTRIM(BranchName))
Выполняет ли это восстановление столбца BranchName для сортировки?
Я рассмотрел некоторые планы выполнения и, похоже, не добавил никаких вычислений, но я думал, что узнаю, что это справедливо как общность вместо моих конкретных случаев.
Основная причина, по которой я спрашиваю, заключается в том, что при выполнении оконной операции, такой как ROWNUMBER() OVER(ORDER BY EmployeeID)
, я не могу использовать порядковый номер ссылки для ORDER BY
. Поэтому, если один из моих столбцов является сложным, я иногда обсуждаю его сброс в переменной таблицы, а затем снова сортирую по нему.
Да, похоже, что добавляет к нему, но если я именовал поле, ему не нужно повторно сканировать таблицу. MS необходимо добавить поддержку псевдонимов в оконный компонент OVER! – 2009-10-08 17:37:30