Поделиться через


sys.dm_exec_plan_attributes (Transact-SQL)

Область применения: SQL Server

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

Примечание.

Некоторые сведения, возвращаемые с помощью этой функции, сопоставляются с представлением обратной совместимости sys.syscacheobjects .

Синтаксис

sys.dm_exec_plan_attributes ( plan_handle )  

Аргументы

plan_handle
Уникально идентифицирует план запроса для запущенного пакета, план которого хранится в кэше планов. plan_handle — varbinary(64). Дескриптор плана можно получить из динамического представления управления sys.dm_exec_cached_plans .

Возвращаемая таблица

Имя столбца Тип данных Description
атрибут varchar(128) Имя атрибута, ассоциированного с этим планом. В таблице под этой таблицей перечислены возможные атрибуты, типы данных и их описания.
значение sql_variant Значение атрибута, ассоциированного с этим планом.
is_cache_key bit Указывает, используется ли атрибут в качестве части ключа уточняющего запроса к кэшу для плана.

В приведенной выше таблице атрибут может иметь следующие значения:

Атрибут Тип данных Description
set_options int Показывает значения параметров, с использованием которых был скомпилирован план.
objectid int Одно из основных ключевых слов, используемое для поиска объекта в кэш-памяти. Это идентификатор объекта, хранящийся в sys.objects для объектов базы данных (процедуры, представления, триггеры и т. д.). Для планов типа «Нерегламентированный» или «Подготовленный» — это внутренний хэш текста пакета.
dbid int Идентификатор базы данных, содержащей сущность, к которой относится план.

Для нерегламентированных и подготовленных планов это идентификатор базы данных, из которой выполняется пакет.
dbid_execute int Для системных объектов, хранящихся в базе данных ресурсов , идентификатор базы данных, из которого выполняется кэшированный план. Во всех остальных случаях это значение равно 0.
user_id. int Значение «-2» означает, что представленный пакет не зависит от неявного разрешения имен и может совместно использоваться разными пользователями. Это является предпочтительным методом. Любое другое значение обозначает идентификатор пользователя, отправившего запрос к базе данных.
language_id smallint Идентификатор языка соединения, в результате которого был создан объект кэша. Дополнительные сведения см. в статье sys.syslanguages (Transact-SQL).
date_format smallint Формат даты соединения, во время которого был создан объект кэша. Дополнительные сведения см. в разделе SET DATEFORMAT (Transact-SQL).
date_first tinyint Значение первой даты. Дополнительные сведения см. в разделе SET DATEFIRST (Transact-SQL).
compat_level tinyint Представляет набор уровня совместимости в базе данных, в контексте которого был скомпилирован план запроса. Возвращаемый уровень совместимости — это уровень совместимости текущего контекста базы данных для операторов adhoc и не влияет на QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n указания запроса. Для инструкций, содержащихся в хранимой процедуре или функции, она соответствует уровню совместимости базы данных, в которой создается хранимая процедура или функция.
статус int Биты внутреннего состояния, являющиеся частью ключа уточняющего запроса к кэшу.
required_cursor_options int Параметры курсора, указанные пользователем, такие как тип курсора.
acceptable_cursor_options int Параметры курсора, в которые SQL Server может неявно преобразоваться для поддержки выполнения инструкции. Например, пользователь может указать динамический курсор, но оптимизатор запросов может преобразовать этот тип курсора в статический.
merge_action_type smallint Тип плана выполнения триггеров, используемого в результате инструкции MERGE.

0 указывает план без триггеров, или план триггеров, который не выполняется в результате инструкции MERGE, или план триггеров, который выполняется в результате инструкции MERGE, в которой задано только действие DELETE.

1 указывает план триггеров INSERT, который выполняется в результате инструкции MERGE.

2 указывает план триггеров UPDATE, который выполняется в результате инструкции MERGE.

3 указывает план триггеров DELETE, который выполняется в результате инструкции MERGE, содержащей соответствующее действие INSERT или UPDATE.

Для вложенных триггеров, выполняемых каскадными операциями, это значение является действием инструкции MERGE, запустившей каскад.
is_replication_specific int Представляет, что сеанс, из которого был скомпилирован этот план, является тем, который подключен к экземпляру SQL Server с помощью незадокументированного свойства подключения, которое позволяет серверу определять сеанс как один, созданный компонентами репликации, чтобы поведение определенных функциональных аспектов сервера изменилось в соответствии с ожидаемым компонентом репликации.
optional_spid smallint Подключение session_id (spid) становится частью ключа кэша, чтобы уменьшить количество повторной компиляции. Это предотвращает повторную компиляцию для повторного использования плана одного сеанса, включающего не динамически привязанные временные таблицы.
optional_clr_trigger_dbid int Заполнено только в случае триггера DML среды CLR. Идентификатор базы данных, содержащей сущность.

Для любого другого типа объекта возвращается ноль.
optional_clr_trigger_objid int Заполнено только в случае триггера DML среды CLR. Идентификатор объекта, хранящийся в sys.objects.

Для любого другого типа объекта возвращается ноль.
parent_plan_handle varbinary(64) Всегда имеет значение NULL.
is_azure_user_plan tinyint 1 для запросов, выполняемых в База данных SQL Azure из сеанса, инициированного пользователем.

0 для запросов, которые были выполнены из сеанса, не инициированного конечным пользователем, но приложениями, работающими из инфраструктуры Azure, которые выдают запросы для других целей сбора данных телеметрии или выполнения административных задач. Клиенты не оплачиваются за ресурсы, потребляемые запросами, где is_azure_user_plan = 0.

База данных SQL Azure только.
inuse_exec_context int Количество выполняемых в данный момент пакетов, использующих план запроса.
free_exec_context int Количество контекстов выполнения в кэш-памяти для плана запроса, которые не используются в данный момент.
hits_exec_context int Количество получений контекста выполнения из кэш-памяти планов и его повторных использований, приводящее к снижению издержек на повторную компиляцию инструкции SQL. Это значение является статистическим для всех пакетов, выполняющихся в настоящий момент.
misses_exec_context int Количество обнаружений отсутствия контекста выполнения в кэш-памяти планов, приводящее к созданию нового контекста выполнения для пакета выполнения.
removed_exec_context int Количество контекстов выполнения, которые были удалены по причине слишком активного использования памяти для плана в кэш-памяти.
inuse_cursors int Количество выполняемых в данный момент пакетов, содержащих один или более курсоров, использующих план в кэш-памяти.
free_cursors int Количество бездействующих или свободных курсоров для плана в кэш-памяти.
hits_cursors int Количество получений неактивного курсора из плана в кэш-памяти и его повторных использований. Это значение является статистическим для всех пакетов, выполняющихся в настоящий момент.
misses_cursors int Количество случаев обнаружения отсутствия неактивного курсора в кэш-памяти.
removed_cursors int Количество курсоров, которые были удалены по причине слишком активного использования памяти для плана в кэше.
sql_handle varbinary(64) Дескриптор SQL для пакета.

Разрешения

В SQL Server требуется разрешение VIEW SERVER STATE.

Для целей службы База данных SQL Azure Basic, S0 и S1, а также для баз данных в эластичных пулах требуется учетная запись администратора сервера или учетная запись администратора Microsoft Entra. Для всех остальных целей VIEW DATABASE STATE службы База данных SQL в базе данных требуется разрешение.

Разрешения для SQL Server 2022 и более поздних версий

Требуется разрешение VIEW SERVER PERFORMANCE STATE на сервере.

Замечания

Параметры SET

Копии одного и того же скомпилированного плана могут отличаться только по значению в столбце set_options . Это указывает на то, что разные соединения используют разные наборы параметров SET для одного запроса. Использование разных наборов параметров, как правило, нежелательно, поскольку приводит к дополнительным компиляциям, меньшему повторному использованию планов и расширению кэша планов по причине размещения нескольких копий планов в кэш-памяти.

Оценка параметров SET

Чтобы перевести значение, возвращаемое в set_options, в параметры, с помощью которых был скомпилирован план, вычитайте значения из значения set_options, начиная с наибольшего возможного значения, пока не достигнете 0. Каждое вычитаемое значение соответствует одному параметру, который использовался в плане запроса. Например, если значение в set_options равно 251, параметры плана были скомпилированы ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Параллельный план (2) и ANSI_PADDING (1).

Вариант Значение
ANSI_PADDING 1
ParallelPlan

Указывает, что параметры параллелизма плана изменились.
2
FORCEPLAN 4
CONCAT_NULL_YIELDS_NULL 8
ANSI_WARNINGS 16
ANSI_NULLS 32
QUOTED_IDENTIFIER 64
ANSI_NULL_DFLT_ON 128
ANSI_NULL_DFLT_OFF 256
NoBrowseTable

Указывает, что план не использует рабочую таблицу для реализации операции FOR BROWSE.
512
TriggerOneRow

Указывает, что план содержит однострочную оптимизацию для таблиц разности триггеров AFTER.
1024
ResyncQuery

Указывает, что запрос был направлен внутренней системной хранимой процедурой.
2048
ARITH_ABORT 4096
NUMERIC_ROUNDABORT 8192
DATEFIRST 16384
DATEFORMAT 32768
LanguageID 65536
UPON

Указывает, что параметру базы данных PARAMETERIZATION присвоено значение FORCED при компиляции плана.
131072
ROWCOUNT Область применения: SQL Server 2012 (11.x) и более поздние версии

262144

Курсоры

Неактивные курсоры кэшируются в скомпилированном плане так, чтобы одновременно работающие пользователи курсоров могли повторно использовать память, использованную для хранения курсора. Предположим, что пакет объявляет и использует курсор без его освобождения. Если два пользователя выполняют один и тот же пакет, то будет два активных курсора. После освобождения курсоров (потенциально в разных пакетах), память, используемая для хранения курсора, кэшируется и не освобождается. Этот список неактивных курсоров хранится в скомпилированном плане. При следующем выполнении пакета пользователем память кэшированного курсора будет использоваться повторно и инициализироваться соответствующим образом, как для активного курсора.

Оценка параметров курсора

Чтобы перевести значение, возвращаемое в required_cursor_options и acceptable_cursor_options в параметры, с помощью которых был скомпилирован план, вычитайте значения из значения столбца, начиная с максимального возможного значения, пока не достигнете 0. Каждое вычитаемое значение соответствует одному курсору, который использовался в плане запроса.

Вариант Значение
нет 0
INSENSITIVE 1
SCROLL 2
READ ONLY 4
FOR UPDATE 8
ЛОКАЛЬНО 16
Глобальные 32
FORWARD_ONLY 64
KEYSET 128
DYNAMIC 256
SCROLL_LOCKS 512
OPTIMISTIC 1024
STATIC 2048
FAST_FORWARD 4096
IN PLACE 8192
FOR select_statement 16384

Примеры

А. Возврат атрибутов для конкретного плана

Следующий пример возвращает все атрибуты для указанного плана. В первый раз динамическое административное представление sys.dm_exec_cached_plans опрашивается для получения дескриптора указанного плана. Во втором запросе <plan_handle> заменяется значением дескриптора плана из первого запроса.

SELECT plan_handle, refcounts, usecounts, size_in_bytes, cacheobjtype, objtype   
FROM sys.dm_exec_cached_plans;  
GO  
SELECT attribute, [value], is_cache_key  
FROM sys.dm_exec_plan_attributes(<plan_handle>);  
GO  

B. Возврат параметров SET для скомпилированных планов и дескриптора SQL для планов в кэш-памяти

Следующий пример возвращает значение, представляющее параметры, с использованием которых был скомпилирован план. Кроме того, возвращается дескриптор SQL для всех кэшированных планов.

SELECT plan_handle, pvt.set_options, pvt.sql_handle  
FROM (  
    SELECT plan_handle, epa.attribute, epa.value   
    FROM sys.dm_exec_cached_plans   
        OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa  
    WHERE cacheobjtype = 'Compiled Plan') AS ecpa   
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("set_options", "sql_handle")) AS pvt;  
GO  

См. также

Динамические административные представления и функции (Transact-SQL)
Связанные с выполнением динамические административные представления и функции (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.databases (Transact-SQL)
sys.objects (Transact-SQL)