Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy do: SQL Server 2016 (13.x) i nowsze wersje
Azure SQL Database
Azure SQL Managed Instance
SQL 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)