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


sys.dm_exec_plan_attributes

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

ПримечаниеПримечание

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

Синтаксис

sys.dm_exec_plan_attributes ( plan_handle )

Аргументы

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

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

Имя столбца

Тип данных

Описание

attribute

varchar(128)

Имя атрибута, ассоциированного с этим планом. Это может быть:

АтрибутТип данныхОписание
set_options int Показывает значения параметров, с использованием которых был скомпилирован план.
objectid int Одно из основных ключевых слов, используемое для поиска объекта в кэш-памяти. Это идентификатор объекта, хранимый в таблице sys.objects базы данных (процедуры, представления, триггеры и т. п.). Для планов типа «Нерегламентированный» или «Подготовленный» — это внутренний хэш текста пакета.
dbid int Идентификатор базы данных, содержащей сущность, к которой относится план. Для нерегламентированных и подготовленных планов это идентификатор базы данных, из которой выполняется пакет.
dbid_execute int Для системных объектов, хранимых в базе данных Resource, представляет собой идентификатор базы данных, из которой выполняется план в кэш-памяти. Во всех остальных случаях это значение равно 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).
status int Биты внутреннего состояния, являющиеся частью ключа уточняющего запроса к кэшу.
required_cursor_options int Параметры курсора, указанные пользователем, такие как тип курсора.
acceptable_cursor_options int Параметры курсора, которые SQL Server может неявно преобразовывать для поддержания выполнения инструкции. Например, пользователь может указать динамический курсор, но оптимизатор запросов может преобразовать этот тип курсора в статический. Дополнительные сведения см. в разделе Использование неявных преобразований курсора.
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 для пакета.
merge_action_type smallint Тип плана выполнения триггеров, используемого в результате инструкции MERGE. 0 указывает план без триггеров, или план триггеров, который не выполняется в результате инструкции MERGE, или план триггеров, который выполняется в результате инструкции MERGE, в которой задано только действие DELETE. 1 указывает план триггеров INSERT, который выполняется в результате инструкции MERGE. 2 указывает план триггеров UPDATE, который выполняется в результате инструкции MERGE. 3 указывает план триггеров DELETE, который выполняется в результате инструкции MERGE, содержащей соответствующее действие INSERT или UPDATE. Для вложенных триггеров, выполняемых каскадными операциями, это значение является действием инструкции MERGE, запустившей каскад.

value

sql_variant

Значение атрибута, ассоциированного с этим планом.

is_cache_key

bit

Указывает, используется ли атрибут в качестве части ключа уточняющего запроса к кэшу для плана.

Разрешения

Требует разрешения VIEW SERVER 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), Parallel Plan(2) и ANSI_PADDING (1).

Параметр

Значение

ANSI_PADDING

1

Parallel Plan

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

Курсоры

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

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

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

Параметр

Значение

нет

0

INSENSITIVE

1

SCROLL

2

READ ONLY

4

FOR UPDATE

8

LOCAL

16

GLOBAL

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

Б. Возврат параметров 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