Udostępnij za pomocą


sys.dm_exec_plan_attributes (Transact-SQL)

Dotyczy do: SQL Server 2016 (13.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Zwraca jeden wiersz na atrybut planu dla planu określonego przez uchwyt planu. Możesz użyć tej funkcji tabelowej, aby uzyskać szczegóły dotyczące konkretnego planu, takie jak wartości kluczy cache lub liczba aktualnych jednoczesnych wykonań planu.

Uwaga / Notatka

Część informacji zwracanych przez tę funkcję jest mapowana na widok sys.syscacheobjects dotyczącą kompatybilności wstecznej.

Składnia

sys.dm_exec_plan_attributes ( plan_handle )  

Arguments

plan_handle
Jednoznacznie identyfikuje plan zapytania dla partii, która została wykonana i której plan znajduje się w pamięci podręcznej planu. plan_handle jest varbinary(64). Uchwyt planu można uzyskać z widoku zarządzania dynamicznego sys.dm_exec_cached_plans .

Zwracana tabela

Nazwa kolumny Typ danych Description
atrybut varchar(128) Nazwa atrybutu związanego z tym planem. Tabela bezpośrednio poniżej tej zawiera listę możliwych atrybutów, ich typów danych oraz opisów.
value sql_variant Wartość atrybutu związanego z tym planem.
is_cache_key bit Wskazuje, czy atrybut jest używany jako część klucza wyszukiwania pamięci podręcznej dla planu.

Z powyższej tabeli atrybut może mieć następujące wartości:

Attribute Typ danych Description
set_options int Wskazuje wartości opcji, z których plan został skompilowany.
identyfikator obiektu int Jeden z głównych kluczy używanych do wyszukiwania obiektu w pamięci podręcznej. Jest to identyfikator obiektu przechowywany w sys.objects dla obiektów bazy danych (procedur, widoków, wyzwalaczy itd.). Dla planów typu "Adhoc" lub "Prepared" jest to wewnętrzny skrót tekstu wsadowego.
dbid int To identyfikator bazy danych zawierającej podmiot, do którego odnosi się plan.

W przypadku planów ad hoc lub przygotowanych jest to identyfikator bazy danych, z którego wykonywana jest wsada.
dbid_execute int Dla obiektów systemowych przechowywanych w bazie zasobów – identyfikator bazy danych, z którego wykonywany jest plan buforowany. We wszystkich pozostałych przypadkach wynosi 0.
identyfikator_użytkownika int Wartość -2 wskazuje, że wysłana partia nie zależy od implicitnego rozwiązywania nazw i może być współdzielona między różnych użytkowników. Jest to preferowana metoda. Każda inna wartość oznacza identyfikator użytkownika wysyłającego zapytanie do bazy danych.
language_id smallint Identyfikator języka połączenia, które utworzyło obiekt pamięci podręcznej. Aby uzyskać więcej informacji, zobacz sys.syslanguages (Transact-SQL).
date_format smallint Format daty połączenia, które utworzyło obiekt pamięci podręcznej. Aby uzyskać więcej informacji, zobacz SET DATEFORMAT (Transact-SQL).
date_first tinyint Datę jako pierwszą wartość. Aby uzyskać więcej informacji, zobacz SET DATEFIRST (Transact-SQL).
compat_level tinyint Reprezentuje zestaw poziomów zgodności w bazie danych, w której kontekście skompilowano plan zapytań. Poziom zgodności zwracany to poziom zgodności bieżącego kontekstu bazy danych dla instrukcji ad hoc i nie jest zmieniony przez wskazówkę zapytania QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n. Dla instrukcji zawartych w procedurze lub funkcji zapisanej odpowiada poziomowi zgodności bazy danych, w której utworzona jest procedura lub funkcja przechowywana.
stan int Wewnętrzne bity statusu będące częścią klucza wyszukiwania pamięci podręcznej.
required_cursor_options int Opcje kursora określone przez użytkownika, takie jak typ kursora.
acceptable_cursor_options int Opcje kursora, do których program SQL Server może niejawnie konwertować, aby obsługiwać wykonywanie instrukcji. Na przykład użytkownik może określić dynamiczny kursor, ale optymalizator zapytań może przekształcić ten typ kursora w statyczny.
merge_action_type smallint Typ planu wykonania wyzwalania używany jako wynik instrukcji MERGE.

0 oznacza plan niewyzwalający, plan wyzwalający, który nie wykonuje się w wyniku instrukcji MERGE, lub plan wyzwalający, który wykonuje się w wyniku instrukcji MERGE określającej jedynie akcję DELETE.

1 oznacza plan wyzwalania INSERT, który działa w wyniku polecenia MERGE.

2 oznacza plan wyzwalania UPDATE, który działa w wyniku instrukcji MERGE.

3 oznacza plan wyzwalania DELETE, który działa w wyniku instrukcji MERGE zawierającej odpowiadającą mu akcję INSERT lub UPDATE.

Dla zagnieżdżonych wyzwalaczy uruchamianych przez kaskadowe akcje, ta wartość to akcja instrukcji MERGE, która spowodowała kaskadę.
is_replication_specific int Oznacza, że sesja, z której ten plan został skompilowany, jest taka, która łączy się z instancją SQL Server za pomocą nieudokumentowanej właściwości połączenia, która pozwala serwerowi zidentyfikować sesję jako taką utworzoną przez komponenty replikacyjne, tak aby zachowanie niektórych funkcjonalnych aspektów serwera było zmieniane zgodnie z oczekiwaniami komponentu replikacji.
optional_spid smallint session_id połączenia (spid) staje się częścią klucza pamięci podręcznej, aby zmniejszyć liczbę rekompilacji. Zapobiega to ponownemu użyciu planu z niedynamicznie powiązanymi tabelami tymczasowymi w jednej sesji.
optional_clr_trigger_dbid int Pojawia się tylko w przypadku wyzwalacza DML CLR. ID bazy danych zawierającej daną jednostkę.

Dla dowolnego innego typu obiektu zwraca się zer.
optional_clr_trigger_objid int Pojawia się tylko w przypadku wyzwalacza DML CLR. ID obiektu przechowywany w sys.objects.

Dla dowolnego innego typu obiektu zwraca się zer.
parent_plan_handle varbinary(64) Zawsze ma wartość NULL.
is_azure_user_plan tinyint 1 dla zapytań wykonywanych w bazie danych Azure SQL z sesji zainicjowanej przez użytkownika.

0 dla zapytań wykonanych z sesji niezainicjowanej przez użytkownika końcowego, lecz przez aplikacje działające wewnątrz infrastruktury Azure, które wydają zapytania w innych celach zbierania telemetrii lub wykonywania zadań administracyjnych. Klienci nie są obciążani opłatą za zasoby zużywane przez zapytania, gdzie is_azure_user_plan = 0.

Azure SQL Database only.
inuse_exec_context int Liczba obecnie realizowanych partii korzystających z planu zapytań.
free_exec_context int Liczba buforowanych kontekstów wykonania planu zapytań, które nie są obecnie używane.
hits_exec_context int Liczba razy kontekst wykonania był pozyskiwany z pamięci podręcznej planu i ponownie wykorzystywany, oszczędzając narzut związany z ponownym kompilowaniem instrukcji SQL. Wartość jest agregatem wszystkich dotychczasowych wykonywań wsadowych.
misses_exec_context int Liczba przypadków, gdy kontekst wykonania nie był dostępny w pamięci podręcznej planu, co skutkowało utworzeniem nowego kontekstu wykonawczego dla wsadowego wykonania.
removed_exec_context int Liczba kontekstów wykonawczych usuniętych z powodu presji pamięci na plan buforowany.
inuse_cursors int Liczba obecnie wykonywanych partii zawierających jeden lub więcej kursorów korzystających z planu buforowego.
free_cursors int Liczba bezczynnych lub wolnych kursorów dla planu w pamięci podręcznej.
hits_cursors int Liczba razy, gdy nieaktywny kursor był pozyskiwany z planu buforowanego i ponownie wykorzystywany. Wartość jest agregatem wszystkich dotychczasowych wykonywań wsadowych.
misses_cursors int Liczba razy, gdy nieaktywny kursor nie był dostępny w pamięci podręcznej.
removed_cursors int Liczba kursorów usuniętych z powodu presji pamięci na plan buforowany.
sql_handle varbinary(64) Uchwyt SQL dla partii.

Permissions

Na SQL Server wymaga VIEW SERVER STATE to pozwolenia.

W celach usług Azure SQL Database Basic, S0 i S1 oraz dla baz danych w elastycznych pulach wymagane jest konto administratora serwera lub Microsoft Entra . We wszystkich pozostałych celach usług SQL Database wymagane jest uprawnienia VIEW DATABASE STATE w bazie danych.

Uprawnienia dla programu SQL Server 2022 i nowszych

Wymaga uprawnienia WYŚWIETL STAN WYDAJNOŚCI SERWERA na serwerze.

Uwagi

Ustawianie opcji

Kopie tego samego skompilowanego planu mogą różnić się jedynie wartością w kolumnie set_options . Wskazuje to, że różne połączenia używają różnych zestawów opcji SET dla tego samego zapytania. Używanie różnych zestawów opcji jest zazwyczaj niepożądane, ponieważ może powodować dodatkowe kompilacje, mniej ponownego użycia planów oraz zawyżanie pamięci podręcznej planów z powodu wielu kopii planów w pamięci.

Ocena opcji zbioru

Aby przełożyć wartość zwróconą w set_options na opcje, z którymi skompilowano plan, odejmij wartości od wartości set_options , zaczynając od największej możliwej wartości, aż do zera. Każda odejmowana wartość odpowiada opcji, która została użyta w planie zapytania. Na przykład, jeśli wartość w set_options wynosi 251, opcje, z którymi skompilowano plan, to ANSI_NULL_DFLT_ON (128), QUOTED_IDENTIFIER (64), ANSI_NULLS(32), ANSI_WARNINGS (16), CONCAT_NULL_YIELDS_NULL (8), Plan równoległy(2) oraz ANSI_PADDING (1).

Option Wartość
ANSI_PADDING 1
ParallelPlan

Wskazuje, że opcje równoległości planów się zmieniły.
2
FORCEPLAN 4
CONCAT_NULL_YIELDS_NULL (łączenie z wartością NULL daje NULL) 8
ANSI_WARNINGS 16
ANSI_NULLS 32
QUOTED_IDENTIFIER 64
ANSI_NULL_DFLT_ON 128
ANSI_NULL_DFLT_OFF 256
NoBrowseTable

Wskazuje, że plan nie używa tabeli roboczej do implementacji operacji FOR PRZEGLĄDANIE.
512
TriggerOneRow

Wskazuje, że plan zawiera optymalizację pojedynczego wiersza dla tabel delta wyzwalaczy AFTER.
1024
ResyncQuery

Wskazuje, że zapytanie zostało przesłane przez wewnętrzne procedury przechowywane w systemie.
2048
ARITH_ABORT 4096
NUMERIC_ROUNDABORT 8192
DATEFIRST 16384
DATEFORMAT 32768
Identyfikator języka 65536
NA

Wskazuje, że opcja PARAMETRYZACJA bazy danych została ustawiona na FORCED podczas kompilacji planu.
131072
ROWCOUNT Dotyczy do: SQL Server 2012 (11.x) i późniejsze

262144

Cursors

Nieaktywne kursory są buforowane w planie skompilowanym, tak aby pamięć używana do przechowywania kursora mogła być ponownie wykorzystana przez współcześników kursorów. Na przykład, załóżmy, że partia deklaruje i używa kursora bez jego delokacji. Jeśli dwóch użytkowników wykonuje tę samą partię, będą dwa aktywne kursory. Po oddzieleniu kursorów (potencjalnie w różnych partiach), pamięć używana do przechowywania kursora jest buforowana i nie jest zwalniana. Ta lista nieaktywnych kursorów jest przechowywana w skompilowanym planie. Przy następnym uruchomieniu partii przez użytkownika pamięć kursora zostanie ponownie wykorzystana i odpowiednio zainicjalizowana jako aktywny kursor.

Ocena opcji kursora

Aby przetłumaczyć wartość zwróconą w required_cursor_options i acceptable_cursor_options na opcje, z którymi skompilowano plan, odejmij wartości od wartości kolumny, zaczynając od największej możliwej wartości, aż do zera. Każda odejmowana wartość odpowiada opcji kursora użytej w planie zapytania.

Option Wartość
Żaden 0
NIEWRAŻLIWY 1
PRZEWIJAĆ 2
TYLKO CZYTAĆ 4
AKTUALIZACJA 8
LOCAL 16
GLOBALNY 32
FORWARD_ONLY 64
ZESTAWU KLUCZY 128
DYNAMICZNY 256
SCROLL_LOCKS 512
OPTYMISTYCZNY 1024
STATYCZNY 2048
FAST_FORWARD 4096
NA MIEJSCU 8192
ZA select_statement 16384

Przykłady

A. Zwracanie atrybutów dla konkretnego planu

Poniższy przykład zwraca wszystkie atrybuty planu dla określonego planu. Najpierw sys.dm_exec_cached_plans zapytany jest dynamiczny widok zarządzania, aby uzyskać uchwyt planu dla określonego planu. W drugim zapytaniu zastąp <plan_handle> go wartością uchwytu planu z pierwszego zapytania.

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. Przywracanie opcji SET dla skompilowanych planów oraz uchwytu SQL dla planów buforowanych

Poniższy przykład zwraca wartość reprezentującą opcje, z których każdy plan został skompilowany. Dodatkowo zwraca się uchwyt SQL dla wszystkich planów cache.

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  

Zobacz też

Dynamiczne widoki zarządzania i funkcje (Transact-SQL)
Dynamiczne widoki zarządzania i funkcje związane z wykonywaniem (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.databases (Transact-SQL)
sys.objects (Transact-SQL)