Оптимизация SQL Server: функция в предложении SELECT вычисляется до или после WHERE?

#sql-server #optimization

#sql-сервер #оптимизация

Вопрос:

Мне просто интересно, если в SQL Server, если в таком заявлении:

 SELECT A.Field1, dbo.someFunction(A.IdentifierID) As Field 
FROM Table A WHERE A.IdentifierID = 1000
 

Будет ли она вызывать someFunction для всех строк в таблице или вызовет ее один раз?

Спасибо!

Комментарии:

1. попробуйте и посмотрите, что быстрее!

Ответ №1:

Она будет вызываться для каждой строки результата

Ответ №2:

количество вызовов зависит от результирующих строк, т.Е. Если на выходе запроса 100 строк, он будет вызываться 100 раз, а не для всех строк в таблице

но если бы это было в предложении where, оно будет оцениваться для каждой строки

Ответ №3:

Будет вызывать ее для каждой строки, но поскольку вы выбираете конкретную строку (или так кажется), она будет вызвана один раз в вашем примере.

Ответ №4:

Как прокомментировал Влад, вы должны попробовать и посмотреть. Конечно, есть два варианта:

  1. Он может вызвать его только один раз, зная, что IdentifierID всегда будет равен 1000.

но это может быть неправильно…

  1. Он может вызывать его для каждой строки — может быть, функция имеет побочные эффекты?

Я сильно подозреваю # 2.

Ответ №5:

Совместимые SQL-серверы должны отображаться так, как если бы они применяли предложение WHERE до применения предложения SELECT . Таким образом, должно казаться, что функция вычисляется не более одного раза для каждой строки, которая удовлетворяет WHERE A.IdentifierID = 1000 .

Но движки баз данных могут свободно оптимизировать, как им нравится, если они дают вам те же результаты, которые требуют стандарты. Итак, в вашем случае, поскольку вы выбираете один идентификационный номер, возможно, придется оценивать функцию только один раз.