Являются ли планы выполнения функций кэшированными в SQL server?


Может ли какой-либо орган помочь мне понять, если план выполнения функций кэшируется в SQL server?

Какой-нибудь интернет-ресурс для этого?

3 5

3 ответа:

Да, они действительно идут в кэш плана выполнения.

Sys.dm_exec_query_plan DMV покажет план для данного дескриптора плана. Цитата оттуда:

Планы запросов для различных типов Пакеты Transact-SQL, такие как ad hoc пакеты, хранимые процедуры и пользовательские функции, кэшируются в область памяти, называемая планом кэш. Каждого кэшированного плана запроса идентифицируется уникальным идентификатором называется планом обработки. Вы можете указать этот план обрабатывать с то sys. dm_exec_query_plan динамический представление управления для извлечения план выполнения для конкретного Запрос или пакет Transact-SQL.

Принятый ответ неточен / вводит в заблуждение, в первую очередь из-за того, что цитата, на которую ссылается автор, слишком расплывчата в отношении термина "определяемые пользователем функции".

Существует несколько различных типов пользовательских функций в Microsoft SQL Server, и они обрабатываются по-разному:
  • Мульти-оператор TVFs:

    Они рассматриваются как хранимые процедуры. Запрос, который выполняет их, показывает только ссылку на их имя, а не на какой-либо из их определение. Они появляются в sys.dm_exec_cached_plans с cacheobjtype " составленного плана "и objtype"Proc". Любые значения входных параметров также хранятся вместе с планом, поэтому Многопараметрические ТВФ подвержены проблемам с нюханием параметров.

  • Встроенные TVFs (iTVFs):

    Они рассматриваются как представления. Запрос, который их выполняет, включает их определение. Они появляются в sys.dm_exec_cached_plans с cacheobjtype " дерева синтаксического анализа "и objtype"представления". Значения входных параметров не хранящиеся вместе с планом, следовательно, встроенные TVFs не подвержены проблемам нюхания параметров.

  • Скалярные UDFs:

    Они рассматриваются как хранимые процедуры. Запрос, который выполняет их, показывает только ссылку на их имя, а не на какое-либо из их определений. Они появляются в sys.dm_exec_cached_plans с cacheobjtype " составленного плана "и objtype"Proc". Любые значения входных параметров также хранятся вместе с планом, поэтому скалярные UDF-файлы подвергаются обнюхиванию параметров проблемы. Кроме того, в отличие от двух типов TVFs, отмеченных выше, но как и обычные хранимые процедуры, вы можете принудительно перекомпилировать план выполнения, используя опцию WITH RECOMPILE при выполнении через EXEC[UTE] вместо SELECT или SET.

  • Объекты SQLCLR:

    Они рассматриваются скорее как код клиента / приложения. Запрос, который выполняет их, показывает только ссылку на их имя, а не на какое-либо из их определений. Они появляются в sys.dm_exec_cached_plans с cacheobjtype "CLR Compiled Func" или "CLR Compiled Proc", и objtype из "Proc". Но, в отличие от многопараметрических TVFs и скалярных UDFs, они не имеют определения и поэтому не имеют связанного плана запроса. Однако любые запросы adhoc (не вызовы хранимых процедур), которые они выполняют, отображаются в sys.dm_exec_cached_plans с cacheobjtype "скомпилированного плана" и objtype "подготовленного". Любой из этих запросов adhoc, если он параметризован, должен хранить исходные значения входных параметров с подготовленным планом и, следовательно, подлежать параметрическому обнюхиванию проблемы.

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

Да, они рассматриваются для кэширования.

Http://msdn.microsoft.com/en-us/library/ms181055.aspx