SQL Server: табличные функции против хранимых процедур - PullRequest
28 голосов
/ 23 ноября 2010

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

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

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

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

Ответы [ 2 ]

29 голосов
/ 23 ноября 2010

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

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

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

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

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

0 голосов
/ 23 ноября 2010

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

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

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

...