Вопрос по выполнению запроса - PullRequest
2 голосов
/ 31 августа 2011

В приведенном ниже запросе, если в таблице «Пациенты» содержится 1000 записей, сколько раз выполняется TableValueFunction?Только один раз или 1000 раз?

Это запрос в хранимой процедуре, есть ли у вас идея лучше улучшить это?

SELECT * FROM Patients
WHERE Patient.Id In (SELECT PatientId FROM TableValueFunction(parameters..))

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

Это зависит от того, что вы используете в качестве параметров.Если параметры являются константами, функция будет выполняться один раз, но если параметры являются полями из Patients, функция будет выполняться столько раз, сколько строк в таблице Patients.

1 голос
/ 31 августа 2011

В некоторой степени это зависит от того, говорите ли вы о встроенном TVF или мультиоператоре.

TVF с несколькими операторами полностью непрозрачен для оптимизатора запросов. Он всегда предполагает, что он вернет 1 строку и не будет расширен в основной запрос.

Из-за допущения в 1 строку, если ваша таблица Patients проиндексирована на PatientId, вы, вероятно, получите объединение вложенных циклов с TVF в качестве таблицы управления, что означает, что она выполняется только один раз.

Если он не проиндексирован и вы получили хеш-код или объединение слиянием, оба эти метода обрабатывают оба входа только один раз.

Встроенный TVF включается в сам запрос. Таким образом, сама функция никогда не выполняется как таковая. Однако SQL Server может затем ссылаться на информацию о количестве элементов и может упорядочить план так, чтобы запрос, содержащийся в TVF, отображался на внутренней стороне соединения с вложенными циклами и имел число выполнений больше одного.

...