Являются ли планы выполнения функций кэшированными в SQL server?
Может ли какой-либо орган помочь мне понять, если план выполнения функций кэшируется в SQL server?
Какой-нибудь интернет-ресурс для этого?
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 намеханизмы кэширования .