План выполнения функций кэшируется на сервере SQL? - PullRequest
5 голосов
/ 22 июня 2010

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

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

Ответы [ 3 ]

8 голосов
/ 22 июня 2010

Да, они попадают в кэш плана выполнения.

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

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

8 голосов
/ 29 ноября 2015

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

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

  • TVF с несколькими утверждениями:

    Они рассматриваются как хранимые процедуры. Запрос, который их выполняет, показывает только ссылку на их имя, а не на их определение. Они появляются в sys.dm_exec_cached_plans с cacheobjtype в «Скомпилированном плане» и objtype в «Proc». Любые значения входных параметров также сохраняются вместе с планом, поэтому для TVF с несколькими утверждениями возникают проблемы с прослушиванием параметров.

  • Встроенные TVF (iTVF):

    Они рассматриваются как представления. Запрос, который их выполняет, включает их определение. Они появляются в sys.dm_exec_cached_plans с cacheobjtype из "Parse Tree" и objtype из "View". Значения входных параметров , а не хранятся вместе с планом, поэтому встроенные TVF не подвержены проблемам с прослушиванием параметров.

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

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

  • Объекты SQLCLR:

    Это больше похоже на код клиента / приложения. Запрос, который их выполняет, показывает только ссылку на их имя, а не на их определение. Они отображаются в sys.dm_exec_cached_plans с cacheobjtype «CLR Compiled Func» или «CLR Compiled Proc» и objtype «Proc». Но, в отличие от TVF с несколькими операторами и скалярных UDF, у них нет определения и, следовательно, нет соответствующего плана запросов. Однако любые специальные запросы (не вызовы хранимых процедур), которые они выполняют, отображаются в sys.dm_exec_cached_plans с cacheobjtype «Скомпилированного плана» и objtype «Подготовлено». Любой из этих специальных запросов, если он параметризован, должен хранить начальные значения входных параметров вместе с подготовленным планом, и, следовательно, будет подвержен проблемам с анализом параметров.

Подробнее о кэшировании объектов см. На странице MSDN Механизмы кэширования .

.
2 голосов
/ 22 июня 2010

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

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

...