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