Udostępnij za pomocą


sys.dm_exec_query_plan (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

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
Jest tokenem, który jednoznacznie identyfikuje plan wykonania zapytań dla partii, która została wykonana, a jej plan znajduje się w pamięci podręcznej planu lub jest obecnie wykonywana. plan_handle jest varbinary(64).

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

Zwracana tabela

Nazwa kolumny Typ danych Description
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 (identyfikator obiektu) int Identyfikator obiektu (na przykład procedura składowana lub funkcja zdefiniowana przez użytkownika) dla tego planu zapytania. W przypadku partii ad hoc i przygotowanych kolumna ma wartość 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. W przypadku partii ad hoc i przygotowanych kolumna ma wartość null.

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

0 = niezaszyfrowane

1 = zaszyfrowane

Kolumna nie jest unieważniona.
query_plan xml Zawiera reprezentację planu wykonania zapytania w czasie kompilacji planu wykonania zapytania, który jest określony 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 żaden wynik Showplan nie jest zwracany w kolumnie query_plan zwróconej tabeli dla sys.dm_exec_query_plan:

  • Jeśli plan zapytań określony przez plan_handle został usunięty z pamięci podręcznej planu, kolumna query_plan w zwróconej tabeli jest nullowa. 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 za pomocą sys.dm_exec_query_plan , chyba że partia jest obecnie wykonywana, ponieważ nie istnieją w pamięci podręcznej.

  • Jeśli Transact-SQL procedura wsadowa lub przechowywana 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 przez sys.dm_exec_query_plan dla procedury wsadowej lub przechowywanej. Zamiast tego musisz wykonać osobne wywołanie, aby sys.dm_exec_query_plan uchwyt planu odpowiadający 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, zadzwoń sys.dm_exec_query_plan dla uchwytu planu przygotowanego parametryzowanego zapytania. Możesz określić, czy zapytanie zostało parametryzowane, odwołując się do kolumny sql w widoku sys.syscacheobjects lub do kolumny tekstowej w widoku zarządzania dynamicznego sys.dm_exec_sql_text .

Uwaga / Notatka

Ze względu na ograniczenie liczby zagnieżdżonych poziomów dozwolonych w typie danych xml , sys.dm_exec_query_plan nie może zwrócić 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 SQL Server 2005 (9.x) Service Pack 2 i późniejszych kolumna query_plan zwraca 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 administratora systemu lub posiadać VIEW SERVER STATE uprawnienia do serwera.

Uprawnienia dla programu SQL Server 2022 i nowszych

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

Przykłady

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

Aby zobaczyć XML Showplans, wykonaj następujące zapytania w Edytorze Zapytań SQL Server Management Studio, a następnie kliknij ShowPlanXML w kolumnie query_plan tabeli zwracanej przez sys.dm_exec_query_plan. Plan XML Showplan wyświetla się w panelu podsumowań Management Studio. Aby zapisać XML Showplan do pliku, kliknij prawym przyciskiem ShowPlanXML w kolumnie query_plan , kliknij Zapisz wyniki jako, 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ą widoku zarządzania dynamicznego sys.dm_exec_query_plan , 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.

Uwaga / Notatka

Aby przeprowadzić ten przykład, zastąp wartości session_id i plan_handle wartościami specyficznymi dla twojego serwera.

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

USE master;  
GO  
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:

USE master;  
GO  
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 argument plan_handle 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 query_plan tabeli zwracanej przez sys.dm_exec_query_plan.

USE master;  
GO  
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. Wyjście XML Showplan dla każdego planu aktualnie znajdującego się w pamięci podręcznej planu znajduje się w kolumnie query_plan tabeli, która jest zwracana.

USE master;  
GO  
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.

USE master;  
GO  
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  

Zobacz też

Dynamiczne widoki zarządzania i funkcje (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)
sys.dm_exec_query_stats (Transact-SQL)
sys.dm_exec_requests (Transact-SQL)
sp_who (Transact-SQL)
Odwołanie do operatorów logicznych i fizycznych Showplan
sys.dm_exec_text_query_plan (Transact-SQL)