Подтвердить что ты не робот

SQL Server: табличные функции и хранимые процедуры

Я много читаю о планах выполнения и проблемах динамических параметров хранимых процедур. Я знаю предлагаемые решения для этого.

Однако мой вопрос - это все, что я прочитал, указав, что SQL Server кэширует план выполнения хранимых процедур. Никаких упоминаний о функциях, связанных с таблицей. Я предполагаю, что он делает это для Views (из интереса).

Переписывает ли он каждый раз, когда вызывается функция табличного значения?

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

4b9b3361

Ответ 1

Функция встроенной таблицы (TVF) похожа на макрос: она расширена во внешний запрос. Он не имеет плана как такового: у вызывающего SQL есть план.

Многорежимный TVF имеет план (найдет ссылку).

TVF полезны там, где вы хотите изменить список SELECT для параметризованного ввода. Встроенные ТВФ расширены, а внешний выбор/где будет рассмотрен оптимизатором. Для оптимизации нескольких операторов TVF оптимизация невозможна, поскольку она должна выполняться до завершения, а затем фильтровать.

Лично я использовал бы хранимую процедуру над многозадачным TVF. Они более гибкие (например, подсказки, могут изменять состояние, SET NOCOUNT ON, SET XACTABORT и т.д.).

У меня нет возражений против встроенных TVF, но они не склонны использовать их для кода, обращенного к клиенту, из-за невозможности использования SET и состояния изменения.

Ответ 2

Я не проверил это, но я считаю само собой разумеющимся, что план выполнения функций также кэшируется. Я не вижу причины, почему это невозможно.

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

Использование функций и хранимых процедур зависит от того, какой результат вам нужен. Функция table-value может возвращать один результат, а хранимая процедура может возвращать один результат, много результатов или вообще никакого результата.