sys.dm_exec_query_plan (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w Microsoft Fabric

Funkcja sys.dm_exec_query_plan dynamicznego zarządzania zwraca Showplan w formacie XML dla partii określonej przez uchwyt planu. Plan określony przez uchwyt planu może być albo buforowany, albo obecnie wykonywany.

Schemat XML dla Showplanu jest opublikowany i dostępny na tej stronie Microsoft. Jest również dostępny w katalogu, w którym zainstalowany jest SQL Server.

Transact-SQL konwencje składni

Składnia

sys.dm_exec_query_plan(plan_handle)

Arguments

plan_handle

Token, który jednoznacznie identyfikuje plan wykonywania zapytania dla partii, która została wykonana, a jego plan znajduje się w pamięci podręcznej planu lub jest obecnie wykonywany. plan_handlejest warbinary(64).

Można uzyskać z plan_handle następujących dynamicznych obiektów zarządzania:

Zwracana tabela

Nazwa kolumny Typ danych Opis
dbid smallint Identyfikator bazy danych kontekstu, która obowiązywała, gdy skompilowano instrukcję Transact-SQL odpowiadającą temu planowi. W przypadku instrukcji ad hoc i przygotowanych sql identyfikator bazy danych, w której skompilowano instrukcje.

Kolumna jest dopuszczana do wartości null.
objectid int Identyfikator obiektu (na przykład procedura składowana lub funkcja zdefiniowana przez użytkownika) dla tego planu zapytania. Dla ad hoc i przygotowanych partii, ta kolumna to NULL.

Kolumna jest dopuszczana do wartości null.
number smallint Liczba całkowita ponumerowanej procedury składowanej. Na przykład grupa procedur dla aplikacji rozkazów może nosić nazwę orderproc;1, orderproc;2, i tak dalej. Dla ad hoc i przygotowanych partii, ta kolumna to NULL.

Kolumna jest dopuszczana do wartości null.
encrypted bit Wskazuje, czy odpowiednia procedura składowana jest szyfrowana.

0 = niezaszyfrowane

1 = zaszyfrowane

Kolumna nie jest unieważniona.
query_plan xml Zawiera reprezentację Showplan w czasie kompilacji planu wykonania zapytań określoną za pomocą plan_handle. Program Showplan ma format XML. Jeden plan jest generowany dla każdej partii zawierającej na przykład instrukcje ad hoc Transact-SQL, wywołania procedury składowanej i wywołania funkcji zdefiniowane przez użytkownika.

Kolumna jest dopuszczana do wartości null.

Uwagi

W następujących warunkach żadne dane wyjściowe programu Showplan nie są zwracane w query_plan kolumnie zwracanej tabeli dla sys.dm_exec_query_planelementu :

  • Jeśli plan zapytań określony przez using plan_handle został usunięty z pamięci podręcznej planu, kolumna query_plan zwróconej tabeli to NULL. Na przykład taki warunek może wystąpić, jeśli istnieje opóźnienie czasowe między momentem przechwycenia uchwytu planu a jego użyciem z sys.dm_exec_query_plan

  • Niektóre instrukcje Transact-SQL nie są buforowane, takie jak instrukcje operacji zbiorczych lub zawierające literale ciągów o rozmiarze większym niż 8 KB. Plany XML dla takich instrukcji nie mogą być pobrane przez użycie sys.dm_exec_query_plan , chyba że partia jest obecnie wykonywana, ponieważ nie istnieją w pamięci podręcznej.

  • Jeśli procedura wsadowa lub przechowywana Transact-SQL zawiera wywołanie funkcji zdefiniowanej przez użytkownika lub wywołanie dynamicznego SQL, na przykład z użyciem EXEC (string), skompilowany plan XML Showplan dla funkcji zdefiniowanej przez użytkownika nie jest uwzględniony w tabeli zwracanej sys.dm_exec_query_plan przez procedurę wsadową lub przechowywaną. Zamiast tego musisz wykonać osobne wywołanie do sys.dm_exec_query_plan uchwytu planu, który odpowiada funkcji zdefiniowanej przez użytkownika.

Gdy zapytanie ad hoc wykorzystuje prostą lub wymuszoną parametryzację, kolumna query_plan zawiera tylko tekst instrukcji, a nie rzeczywisty plan zapytania. Aby zwrócić plan zapytania, wywołaj sys.dm_exec_query_plan uchwyt planu przygotowanego parametryzowanego zapytania. Możesz określić, czy zapytanie zostało parametryzowane, odwołując się do kolumny sql widoku sys.syscacheobjects lub kolumny tekstowej w widoku zarządzania dynamicznego sys.dm_exec_sql_text .

Note

Ze względu na ograniczenie liczby zagnieżdżonych poziomów dozwolonych w typie danych xml , nie sys.dm_exec_query_plan można zwracać planów zapytań spełniających lub przekraczających 128 poziomów zagnieżdżonych elementów. We wcześniejszych wersjach programu SQL Server ten warunek uniemożliwił zwracanie planu zapytania i generowanie błędu 6335. W programie SQL Server 2005 (9.x) z dodatkiem Service Pack 2 lub nowszym kolumna query_plan zwraca wartość NULL.
Możesz użyć funkcji zarządzania dynamicznego sys.dm_exec_text_query_plan (Transact-SQL ), aby zwrócić wyjście planu zapytania w formacie tekstowym.

Permissions

Aby wykonać sys.dm_exec_query_plan, użytkownik musi być członkiem stałej roli serwera administratora systemu lub posiadać VIEW SERVER STATE uprawnienia do serwera.

Uprawnienia dla wersji SQL Server 2022 i nowszych

Wymaga VIEW SERVER PERFORMANCE STATE uprawnień na serwerze.

Examples

Poniższe przykłady pokazują, jak korzystać z dynamicznego widoku sys.dm_exec_query_plan zarządzania.

Aby zobaczyć XML Showplans, wykonaj następujące zapytania w Edytor Power Query w SQL Server Management Studio, a następnie wybierz ShowPlanXML w kolumnie query_plan tabeli zwracanej przez sys.dm_exec_query_plan The XML Showplan wyświetla się w panelu podsumowań Management Studio. Aby zapisać XML Showplan do pliku, kliknij prawym przyciskiem ShowPlanXML w kolumnie query_plan , wybierz Save Results As i nazwij plik w formacie <file name>.sqlplan; na przykład MyXMLShowplan.sqlplan.

A. Pobierz plan zapytań w pamięci podręcznej dla wolno działającego Transact-SQL zapytania lub partii

Plany zapytań dla różnych typów Transact-SQL partii, takich jak ad hoc partie, procedury przechowywane i funkcje definiowane przez użytkownika, są buforowane w obszarze pamięci zwanym pamięćą podręczną planu. Każdy plan zapytań w pamięci podręcznej jest identyfikowany unikalnym identyfikatorem zwanym uchwytem planu. Możesz określić ten uchwyt planu za pomocą dynamicznego widoku sys.dm_exec_query_plan zarządzania, aby pobrać plan wykonania dla konkretnego zapytania lub partii Transact-SQL.

Jeśli zapytanie Transact-SQL lub partia działa długo na konkretnym połączeniu z SQL Server, pobierz plan wykonania tego zapytania lub partii, aby odkryć, co powoduje opóźnienie. Poniższy przykład pokazuje, jak pobrać XML Showplan dla wolno działającego zapytania lub partii.

Note

Aby uruchomić ten przykład, zastąp wartości dla session_id i plan_handle na wartości specyficzne dla twojego serwera.

Najpierw pobierz identyfikator sesji (SPID) dla procesu wykonującego zapytanie lub wsadę, używając procedury sp_who przechowywanej:

exec sp_who;  
GO  

Zbiór wyników, który jest zwracany przez , sp_who wskazuje, że identyfikator sesji to .54 Możesz użyć identyfikatora sesji w dynamicznym widoku sys.dm_exec_requests zarządzania, aby pobrać uchwyt planu, korzystając z następującego zapytania:

SELECT * FROM sys.dm_exec_requests  
WHERE session_id = 54;  
GO  

Tabela zwracana przez sys.dm_exec_requests wskazuje, że uchwyt planu dla wolno działającego zapytania lub partii to 0x06000100A27E7C1FA821B10600, co można określić jako plan_handle argument z , sys.dm_exec_query_plan aby pobrać plan wykonania w formacie XML w następujący sposób. Plan wykonania w formacie XML dla wolno działającego zapytania lub partii zawarty jest w kolumnie tabeli query_plan zwracanej przez sys.dm_exec_query_plan.

SELECT * 
FROM sys.dm_exec_query_plan (0x06000100A27E7C1FA821B10600);  
GO  

B. Pobierz każdy plan zapytań z pamięci podręcznej planu

Aby pobrać migawkę wszystkich planów zapytań znajdujących się w pamięci podręcznej planów, pobierz uchwyty planów wszystkich planów zapytań w pamięci podręcznej, wykonując zapytanie w sys.dm_exec_cached_plans dynamicznym widoku zarządzania. Uchwyty planu są przechowywane w kolumnie plan_handle .sys.dm_exec_cached_plans Następnie użyj operatora CROSS APPLY, aby przekazać uchwyty planu w sys.dm_exec_query_plan następujący sposób. Dane wyjściowe programu Showplan XML dla każdego planu aktualnie w pamięci podręcznej planu znajduje się w kolumnie query_plan tabeli, która jest zwracana.

SELECT * 
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);  
GO  

C. Pobierz każdy plan zapytań, dla którego serwer zebrał statystyki zapytań z pamięci podręcznej planu

Aby pobrać migawkę wszystkich planów zapytań, dla których serwer zebrał statystyki aktualnie znajdujące się w pamięci podręcznej planów, pobierz uchwyty planów tych planów w pamięci podręcznej, zapytując sys.dm_exec_query_stats widok zarządzania dynamicznego. Uchwyty planu są przechowywane w kolumnie plan_handle .sys.dm_exec_query_stats Następnie użyj operatora CROSS APPLY, aby przekazać uchwyty planu w sys.dm_exec_query_plan następujący sposób. Wyjście XML Showplan dla każdego planu, dla którego serwer zebrał statystyki aktualnie w pamięci podręcznej planu, znajduje się w kolumnie query_plan tabeli, która jest zwracana.

SELECT * 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle);  
GO  

D. Pobierz informacje o pięciu największych zapytaniach według średniego czasu CPU

Poniższy przykład zwraca plany oraz średni czas CPU dla pięciu najczęściej zapytań.

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
   plan_handle, query_plan   
FROM sys.dm_exec_query_stats AS qs  
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)  
ORDER BY total_worker_time/execution_count DESC;  
GO