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)