SQL Server: табличные функции и хранимые процедуры
Я много читаю о планах выполнения и проблемах динамических параметров хранимых процедур. Я знаю предлагаемые решения для этого.
Однако мой вопрос - это все, что я прочитал, указав, что SQL Server кэширует план выполнения хранимых процедур. Никаких упоминаний о функциях, связанных с таблицей. Я предполагаю, что он делает это для Views (из интереса).
Переписывает ли он каждый раз, когда вызывается функция табличного значения?
Когда лучше использовать функцию табличного значения вместо хранимой процедуры?
Ответы
Ответ 1
Функция встроенной таблицы (TVF) похожа на макрос: она расширена во внешний запрос. Он не имеет плана как такового: у вызывающего SQL есть план.
Многорежимный TVF имеет план (найдет ссылку).
TVF полезны там, где вы хотите изменить список SELECT для параметризованного ввода. Встроенные ТВФ расширены, а внешний выбор/где будет рассмотрен оптимизатором. Для оптимизации нескольких операторов TVF оптимизация невозможна, поскольку она должна выполняться до завершения, а затем фильтровать.
Лично я использовал бы хранимую процедуру над многозадачным TVF. Они более гибкие (например, подсказки, могут изменять состояние, SET NOCOUNT ON, SET XACTABORT и т.д.).
У меня нет возражений против встроенных TVF, но они не склонны использовать их для кода, обращенного к клиенту, из-за невозможности использования SET и состояния изменения.
Ответ 2
Я не проверил это, но я считаю само собой разумеющимся, что план выполнения функций также кэшируется. Я не вижу причины, почему это невозможно.
Однако план выполнения представлений не кэшируется. Запрос в представлении будет частью запроса, который использует представление, поэтому план выполнения может быть кэширован для запроса, который использует представление, но не для самого представления.
Использование функций и хранимых процедур зависит от того, какой результат вам нужен. Функция table-value может возвращать один результат, а хранимая процедура может возвращать один результат, много результатов или вообще никакого результата.