sys.dm_exec_query_plan (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Gibt für den vom Planhandle angegebenen Batch den Showplan im XML-Format zurück. Der vom Planhandle angegebene Plan ist möglicherweise zwischengespeichert oder wird gerade ausgeführt.

Das XML-Schema für den Showplan ist veröffentlicht und auf dieser Microsoft-Websiteverfügbar. Sie ist auch in dem Verzeichnis verfügbar, in dem SQL Server installiert ist.

Transact-SQL-Syntaxkonventionen

Syntax

sys.dm_exec_query_plan(plan_handle)  

Argumente

plan_handle
Ein Token, das einen Abfrageausführungsplan für einen Batch eindeutig identifiziert, der ausgeführt wurde und dessen Plan sich im Plancache befindet, oder der derzeit ausgeführt wird. plan_handle ist varbinary(64)

plan_handle kann aus den folgenden dynamischen Verwaltungsobjekten abgerufen werden:

Zurückgegebene Tabelle

Spaltenname Datentyp BESCHREIBUNG
dbid smallint ID der Kontextdatenbank, die gültig war, als die diesem Plan entsprechende Transact-SQL-Anweisung kompiliert wurde. Für Ad-hoc-Anweisungen und vorbereitete SQL-Anweisungen, die ID der Datenbank, in der die Anweisungen kompiliert wurden.

Die Spalte lässt NULL-Werte zu.
objectid int ID des Objekts (z. B. gespeicherte Prozedur oder benutzerdefinierte Funktion) für diesen Abfrageplan. Für Ad-hoc- und vorbereitete Batches entspricht diese Spalte dem Wert NULL.

Die Spalte lässt NULL-Werte zu.
Zahl smallint Gespeicherte Prozedur mit ganzer Zahl. Eine Gruppe von Prozeduren für die orders-Anwendung kann z. B. die Namen orderproc;1, orderproc;2 usw. haben. Für Ad-hoc- und vorbereitete Batches entspricht diese Spalte dem Wert NULL.

Die Spalte lässt NULL-Werte zu.
encrypted bit Zeigt an, ob die entsprechende Prozedur verschlüsselt ist.

0 = nicht verschlüsselt

1 = verschlüsselt

NULL-Werte sind in der Spalte nicht zulässig.
query_plan xml Enthält eine zur Kompilierzeit erstellte Showplandarstellung des Abfrageausführungsplans, der mit plan_handleangegeben ist. Der Showplan liegt im XML-Format vor. Für jeden Batch, der z. B. Ad-hoc-Transact-SQL-Anweisungen, Aufrufe von gespeicherten Prozeduren sowie benutzerdefinierte Funktionsaufrufe enthält, wird jeweils ein Plan generiert.

Die Spalte lässt NULL-Werte zu.

Bemerkungen

Unter den folgenden Bedingungen wird keine Showplanausgabe in der query_plan-Spalte der zurückgegebenen Tabelle für sys.dm_exec_query_plan zurückgegeben:

  • Falls der mit plan_handle angegebene Abfrageplan aus dem Plancache entfernt wurde, enthält die query_plan -Spalte der zurückgegebenen Tabelle den Wert NULL. Diese Bedingung kann z. B. auftreten, wenn es eine Zeitverzögerung zwischen der Erfassung des Planhandles und seiner Verwendung mit sys.dm_exec_query_plan gibt.

  • Einige Transact-SQL -Anweisungen werden nicht zwischengespeichert. Beispiele hierfür sind Anweisungen für Massenvorgänge oder Anweisungen mit Zeichenfolgenliteralen, die größer als 8 KB sind. XML-Showpläne für diese Anweisungen können mit sys.dm_exec_query_plan nur abgerufen werden, wenn der Batch gerade ausgeführt wird, da sie im Cache nicht vorhanden sind.

  • Wenn ein Transact-SQL-Batch oder eine gespeicherte Prozedur einen Aufruf einer benutzerdefinierten Funktion oder einen Aufruf von dynamischem SQL enthält, z. B. mit EXEC (Zeichenfolge), wird der kompilierte XML-Showplan für die benutzerdefinierte Funktion nicht in der Tabelle enthalten, die von sys.dm_exec_query_plan für den Batch oder die gespeicherte Prozedur zurückgegeben wird. Stattdessen müssen Sie einen separaten Aufruf von sys.dm_exec_query_plan für das Planhandle erstellen, das der benutzerdefinierten Funktion entspricht.

Wenn bei einer Ad-hoc-Abfrage einfache oder erzwungene Parametrisierung verwendet wird, ist in der Spalte query_plan nur der Anweisungstext enthalten, nicht der tatsächliche Abfrageplan. Rufen Sie zum Zurückgeben des Abfrageplans sys.dm_exec_query_plan für das Planhandle der vorbereiteten parametrisierten Abfrage auf. Sie können anhand der sql-Spalte der sys.syscacheobjects-Sicht oder anhand der Textspalte der dynamischen sys.dm_exec_sql_text-Verwaltungssicht ermitteln, ob die Abfrage parametrisiert wurde.

Hinweis

Aufgrund einer Beschränkung der im xml -Datentyp zulässigen Anzahl geschachtelter Ebenen kann sys.dm_exec_query_plan keine Abfragepläne zurückgeben, die 128 oder mehr Ebenen geschachtelter Elemente aufweisen. In früheren Versionen von SQL Server verhinderte diese Bedingung die Rückgabe des Abfrageplans und generiert den Fehler 6335. In SQL Server 2005 (9.x) Service Pack 2 und höheren Versionen gibt die spalte query_plan null zurück.
Sie können die dynamische Verwaltungsfunktion sys.dm_exec_text_query_plan (Transact-SQL) verwenden, um die Ausgabe des Abfrageplans im Textformat zurückzugeben.

Berechtigungen

Um sys.dm_exec_query_plan auszuführen, muss ein Benutzer Mitglied der festen Serverrolle sysadmin sein oder über die VIEW SERVER STATE Berechtigung auf dem Server verfügen.

Berechtigungen für SQL Server 2022 und höher

Erfordert die VIEW SERVER PERFORMANCE STATE-Berechtigung auf dem Server.

Beispiele

Im folgenden Beispiel wird die Verwendung der dynamischen Verwaltungssicht sys.dm_exec_query_plan gezeigt.

Führen Sie zum Anzeigen der XML-Showplans die folgenden Abfragen im Abfrage-Editor von SQL Server Management Studio aus, und klicken Sie dann in der spalte query_plan der von sys.dm_exec_query_plan zurückgegebenen Tabelle auf ShowPlanXML. Der XML-Showplan wird im Zusammenfassungsbereich von Management Studio angezeigt. Klicken Sie zum Speichern des XML-Showplans in einer Datei in der Spalte query_plan mit der rechten Maustaste auf ShowPlanXML, klicken Sie auf Ergebnisse speichern unter, und benennen Sie die Datei im Format <file_name.sqlplan>, z. B. MyXMLShowplan.sqlplan.

A. Abrufen des zwischengespeicherten Abfrageplans für eine langsam ausgeführte Transact-SQL-Abfrage oder einen langsam ausgeführten Transact-SQL-Batch

Abfragepläne für verschiedene Typen von Transact-SQL-Batches, z. B. Ad-hoc-Batches, gespeicherte Prozeduren und benutzerdefinierte Funktionen, werden in einem Speicherbereich, der als Plancache bezeichnet wird, zwischengespeichert. Jeder zwischengespeicherte Abfrageplan wird durch einen eindeutigen Bezeichner identifiziert, der Planhandle genannt wird. Sie können dieses Planhandle mit der sys.dm_exec_query_plan dynamischen Verwaltungsansicht angeben, um den Ausführungsplan für eine bestimmte Transact-SQL-Abfrage oder einen bestimmten Transact-SQL-Batch abzurufen.

Wenn eine Transact-SQL-Abfrage oder ein Transact-SQL-Batch sehr lange über eine bestimmte Verbindung mit SQL Server ausgeführt wird, rufen Sie den Ausführungsplan für diese Abfrage oder diesen Batch ab, um die Ursache der Verzögerung zu ermitteln. Im folgenden Beispiel wird das Abrufen des XML-Showplans für eine langsam ausgeführte Abfrage oder einen Batch gezeigt.

Hinweis

Ersetzen Sie zum Ausführen dieses Beispiels die Werte für session_id und plan_handle mit den Werten Ihres Servers.

Rufen Sie zunächst die Serverprozess-ID (SPID) für den Prozess ab, der die Abfrage oder den Batch ausführt, indem Sie die gespeicherte Prozedur sp_who verwenden:

USE master;  
GO  
exec sp_who;  
GO  

Das von sp_who zurückgegebene Resultset gibt die SPID 54an. Verwenden Sie die SPID nun mit der dynamischen Verwaltungssicht sys.dm_exec_requests , um das Planhandle mithilfe der folgenden Abfrage abzurufen:

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

In der von sys.dm_exec_requests zurückgegebenen Tabelle wird angezeigt, dass das Planhandle für die langsam ausgeführte Abfrage oder den Batch 0x06000100A27E7C1FA821B10600lautet. Geben Sie diesen Wert als plan_handle -Argument mit sys.dm_exec_query_plan an, um den Ausführungsplan im XML-Format wie folgt abzurufen. Der Ausführungsplan im XML-Format für die langsam ausgeführte Abfrage oder den Batch ist in der query_plan-Spalte der von sys.dm_exec_query_plan zurückgegebenen Tabelle enthalten.

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

B. Abrufen jedes einzelnen Abfrageplans aus dem Plancache

Wenn Sie eine Momentaufnahme aller im Plancache gespeicherten Abfragen abrufen möchten, rufen Sie die Planhandles aller Abfragepläne im Cache ab, indem Sie die dynamische Verwaltungssicht sys.dm_exec_cached_plans abfragen. Die Planhandles sind in der plan_handle -Spalte von sys.dm_exec_cached_plansgespeichert. Verwenden Sie dann den CROSS APPLY-Operator, um die Planhandles wie folgt an sys.dm_exec_query_plan zu übergeben. Die XML-Showplanausgabe für jeden aktuell im Plancache gespeicherten Plan wird in der query_plan -Spalte der zurückgegebenen Tabelle angezeigt.

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

C. Abrufen jedes einzelnen Abfrageplans aus dem Plancache, für den der Server eine Abfragestatistik erfasst hat

Wenn Sie eine Momentaufnahme aller im Plancache gespeicherten Abfragen abrufen möchten, für die der Server eine Statistik erfasst hat, rufen Sie die Planhandles dieser Pläne im Cache ab, indem Sie die dynamische Verwaltungssicht sys.dm_exec_query_stats abfragen. Die Planhandles sind in der plan_handle -Spalte von sys.dm_exec_query_statsgespeichert. Verwenden Sie dann den CROSS APPLY-Operator, um die Planhandles wie folgt an sys.dm_exec_query_plan zu übergeben. Die XML-Showplanausgabe für jeden aktuell im Plancache gespeicherten Plan, für den der Server eine Statistik erfasst hat, wird in der query_plan -Spalte der zurückgegebenen Tabelle angezeigt.

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

D: Abrufen von Informationen zu den fünf Abfragen mit dem höchsten durchschnittlichen CPU-Zeitaufwand

Im folgenden Beispiel werden die Pläne und die durchschnittliche CPU-Zeit für die fünf Abfragen mit der höchsten durchschnittlichen CPU-Zeit zurückgegeben.

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  

Weitere Informationen

Dynamische Verwaltungssichten und Funktionen (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)
Referenz zu logischen und physischen Showplanoperatoren
sys.dm_exec_text_query_plan (Transact-SQL)