Udostępnij za pomocą


sys.dm_exec_text_query_plan (Transact-SQL)

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

Zwraca Showplan w formacie tekstowym dla partii Transact-SQL lub dla konkretnego wyciągu w partii. Plan zapytań określony przez uchwyt planu może być albo buforowany, albo obecnie wykonywany. Ta funkcja tabelowa jest podobna do sys.dm_exec_query_plan (Transact-SQL), ale ma następujące różnice:

  • Wyjście planu zapytania jest zwracane w formacie tekstowym.
  • Wyjście planu zapytania nie jest ograniczone rozmiarem.
  • Można określić poszczególne oświadczenia w partii.

Dotyczy do: SQL Server (SQL Server 2008 (10.0.x) i nowszy), Azure SQL Database.

Transact-SQL konwencje składni

Składnia

sys.dm_exec_text_query_plan   
(   
    plan_handle   
    , { statement_start_offset | 0 | DEFAULT }  
        , { statement_end_offset | -1 | DEFAULT }  
)  

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:

statement_start_offset | 0 | DOMYŚLNY
Wskazuje, w bajtach, pozycję początkową zapytania, którą wiersz opisuje w tekście swojego obiektu wsadowego lub trwałego. statement_start_offset to inteligencja. Wartość 0 oznacza początek partii. Wartość domyślna to 0.

Przesunięcie początkowe instrukcji można uzyskać z następujących dynamicznych obiektów zarządzania:

statement_end_offset | -1 | DOMYŚLNY
Wskazuje, w bajtach, końcową pozycję zapytania, którą wiersz opisuje w tekście swojego obiektu wsadowego lub trwałego.

statement_start_offset to inteligencja.

Wartość -1 oznacza koniec partii. Wartość domyślna to -1.

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 nvarchar(max) Zawiera reprezentację planu wykonania zapytania w czasie kompilacji planu wykonania zapytania, który jest określony za pomocą plan_handle. Plan przedstawienia jest w formacie tekstowym. 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 planu zwróconej tabeli przez sys.dm_exec_text_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_text_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 pokazu takich zdań nie mogą być pobrane za pomocą sys.dm_exec_text_query_plan , ponieważ nie istnieją w pamięci podręcznej.

  • Jeśli procedura wsadowa lub zapisana 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 przez sys.dm_exec_text_query_plan dla procedury wsadowej lub przechowywanej. Zamiast tego musisz wykonać osobne wywołanie sys.dm_exec_text_query_plan dla plan_handle odpowiadającego funkcji zdefiniowanej przez użytkownika.

Gdy zapytanie ad hoc stosuje 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_text_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 .

Permissions

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

Uprawnienia dla programu SQL Server 2022 i nowszych

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

Przykłady

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

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ć 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 Poniższy przykład zwraca plan zapytań dla określonego uchwytu planu i wykorzystuje domyślne wartości 0 i -1 do zwracania wszystkich instrukcji w zapytaniu lub partii.

USE master;  
GO  
SELECT query_plan   
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);  
GO  

B. Pobieranie każdego planu 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_text_query_plan następujący sposób. Wynik 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_text_query_plan(cp.plan_handle, DEFAULT, DEFAULT);  
GO  

C. Pobieranie każdego planu 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_text_query_plan następujący sposób. Wynik Showplan dla każdego 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_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset);  
GO  

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

Poniższy przykład zwraca plany zapytań oraz średni czas CPU dla pięciu najczęstszych zapytań. Funkcja sys.dm_exec_text_query_plan określa domyślne wartości 0 i -1 zwracają wszystkie instrukcje w partii w planie 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_text_query_plan(qs.plan_handle, 0, -1)  
ORDER BY total_worker_time/execution_count DESC;  
GO  

Zobacz też

sys.dm_exec_query_plan (Transact-SQL)