#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:
Как прокомментировал Влад, вы должны попробовать и посмотреть. Конечно, есть два варианта:
- Он может вызвать его только один раз, зная, что IdentifierID всегда будет равен 1000.
но это может быть неправильно…
- Он может вызывать его для каждой строки — может быть, функция имеет побочные эффекты?
Я сильно подозреваю # 2.
Ответ №5:
Совместимые SQL-серверы должны отображаться так, как если бы они применяли предложение WHERE до применения предложения SELECT . Таким образом, должно казаться, что функция вычисляется не более одного раза для каждой строки, которая удовлетворяет WHERE A.IdentifierID = 1000
.
Но движки баз данных могут свободно оптимизировать, как им нравится, если они дают вам те же результаты, которые требуют стандарты. Итак, в вашем случае, поскольку вы выбираете один идентификационный номер, возможно, придется оценивать функцию только один раз.