SET SHOWPLAN_ALL (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Dies bewirkt, dass Microsoft SQL Server Transact-SQL-Anweisungen nicht ausführt. Stattdessen gibt SQL Server detaillierte Informationen über die Ausführung der Anweisungen (einen Abfrageplan) sowie Schätzungen der Ressourcenanforderungen für die Anweisungen und erwarteten Zeilen (Kardinalitätsschätzung) zurück.
Transact-SQL-Syntaxkonventionen
Syntax
SET SHOWPLAN_ALL { ON | OFF }
Hinweise
Die Einstellung von SET SHOWPLAN_ALL wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.
Wenn SET SHOWPLAN_ALL
auf ON festgelegt ist, gibt SQL Server Ausführungsinformationen zu jeder Anweisung zurück, ohne sie auszuführen, und Transact-SQL-Anweisungen werden nicht ausgeführt. Nachdem diese Option auf ON festgelegt wurde, werden Informationen zu allen weiteren Transact-SQL-Anweisungen zurückgegeben, bis die Option auf OFF festgelegt wird. Wenn z. B. eine CREATE TABLE-Anweisung ausgeführt wird, während SET SHOWPLAN_ALL
auf ON festgelegt ist, gibt SQL Server bei einer nachfolgenden SELECT-Anweisung, die dieselbe Tabelle betrifft, eine Fehlermeldung zurück, in der der*die Benutzer*in informiert darüber wird, dass diese Tabelle nicht vorhanden ist. Daher schlagen spätere Verweise auf diese Tabelle fehl. Wenn SET SHOWPLAN_ALL auf OFF festgelegt ist, führt SQL Server die Anweisungen aus, ohne einen Bericht zu generieren.
SET SHOWPLAN_ALL
ist dafür gedacht, von Anwendungen verwendet zu werden, die die entsprechende Ausgabe verarbeiten sollen. Verwenden Sie SET SHOWPLAN_TEXT, um eine lesbare Ausgabe für Microsoft Win32-Eingabeaufforderungsanwendungen, wie z.B. das Hilfsprogramm osql, zurückzugeben.
SET SHOWPLAN_TEXT und SET SHOWPLAN_ALL können nicht in einer gespeicherten Prozedur angegeben werden; diese Anweisungen müssen die einzigen Anweisungen in einem Batch sein.
SET SHOWPLAN_TEXT gibt Zeilen einer hierarchischen Struktur zurück, die die vom SQL Server-Abfrageprozessor beim Ausführen einer Anweisung durchgeführten Schritte darstellen. Jede in der Ausgabe widergespiegelte Anweisung enthält zuerst eine Zeile mit dem Text der Anweisung, auf die mehrere Zeilen mit den Details der Ausführungsschritte folgen. Die Tabelle zeigt die Spalten, die in der Ausgabe enthalten sind.
Spaltenname | BESCHREIBUNG |
---|---|
StmtText | Für Zeilen, die nicht vom Typ PLAN_ROW sind, enthält diese Spalte den Text der Transact-SQL-Anweisung. Für Zeilen vom Typ PLAN_ROW enthält diese Spalte eine Beschreibung des Vorgangs. Diese Spalte enthält den physischen Operator und optional auch den logischen Operator. Auf die Spalte kann auch eine Beschreibung folgen, die vom physischen Operator bestimmt wird. Weitere Informationen finden Sie unter Referenz zu logischen und physischen Showplanoperatoren |
StmtId | Nummer der Anweisung im aktuellen Batch. |
NodeId | ID des Knotens in der aktuellen Abfrage. |
Parent | Knoten-ID des übergeordneten Schrittes. |
PhysicalOp | Algorithmus der physischen Implementierung für den Knoten. Nur für Zeilen vom Typ PLAN_ROWS. |
LogicalOp | Relationaler algebraischer Operator, den dieser Knoten darstellt. Nur für Zeilen vom Typ PLAN_ROWS. |
Argument | Gibt Zusatzinformationen zur durchgeführten Operation. Der Inhalt dieser Spalte hängt vom physischen Operator ab. |
DefinedValues | Enthält eine Liste mit durch Trennzeichen getrennten Werten, die dieser Operator einführt. Die Werte können berechnete Ausdrücke aus der aktuellen Abfrage (z. B. aus der SELECT-Liste oder der WHERE-Klausel) oder interne Werte sein, die der Abfrageprozessor eingeführt hat, um diese Abfrage zu verarbeiten. Auf diese definierten Werte kann dann an anderer Stelle in dieser Abfrage verwiesen werden. Nur für Zeilen vom Typ PLAN_ROWS. |
EstimateRows | Geschätzte Anzahl der Zeilen, die dieser Operator ausgibt. Nur für Zeilen vom Typ PLAN_ROWS. |
EstimateIO | Geschätzte E/A-Kosten* für diesen Operator. Nur für Zeilen vom Typ PLAN_ROWS. |
EstimateCPU | Geschätzte CPU-Kosten* für diesen Operator. Nur für Zeilen vom Typ PLAN_ROWS. |
AvgRowSize | Geschätzte mittlere Zeilenlänge (in Bytes) der Zeile, die durch diesen Operator übergeben wird. |
TotalSubtreeCost | Geschätzte (kumulierte) Kosten* dieses Vorgangs und aller untergeordneten Vorgänge. |
OutputList | Enthält eine Liste mit durch Trennzeichen getrennten Spalten, die vom aktuellen Vorgang projiziert werden. |
Warnings | Enthält eine Liste mit durch Trennzeichen getrennten Warnmeldungen, die die aktuelle Operation betreffen. Warnmeldungen können die Zeichenfolge "NO STATS:()" mit einer Spaltenliste enthalten. Diese Warnmeldung bedeutet, dass der Abfrageoptimierer versucht hat, eine Entscheidung auf der Grundlage der Statistik für diese Spalte zu treffen, wobei jedoch keine Statistik verfügbar war. Daher musste der Abfrageoptimierer eine Schätzung vornehmen, die möglicherweise zur Auswahl eines ineffizienten Abfrageplans führte. Weitere Informationen zum Erstellen und Aktualisieren einer Spaltenstatistik (sie ermöglicht dem Abfrageoptimierer die Auswahl eines effizienteren Ausführungsplans) finden Sie unter UPDATE STATISTICS. Diese Spalte kann optional die Zeichenfolge "MISSING JOIN PREDICATE" enthalten. Sie gibt an, dass ein Join (mit Tabellen) ohne Joinprädikat vorgenommen wird. Das unbeabsichtigte Löschen eines Joinprädikats kann zu einer Abfrage führen, die eine erheblich längere Ausführungszeit als erwartet hat und ein sehr umfangreiches Resultset zurückgibt. Wenn diese Warnung besteht, überprüfen Sie, ob das Fehlen des Joinprädikats absichtlich ist. |
Type | Der Knotentyp. Für den übergeordneten Knoten jeder Abfrage ist dies der Transact-SQL-Anweisungstyp (z. B. SELECT, INSERT, EXECUTE usw.). Für untergeordnete Knoten, die Ausführungspläne darstellen, ist der Typ PLAN_ROW. |
Parallel | 0 = Operator wird nicht parallel ausgeführt. 1 = Operator wird parallel ausgeführt. |
EstimateExecutions | Geschätzte Anzahl der Ausführungen dieses Operators, die während der Ausführung der aktuellen Abfrage ausgeführt werden. |
*Kosteneinheiten basieren auf einer internen Zeitmessung und nicht auf der normalen Uhrzeit. Sie werden zur Ermittlung der relativen Kosten eines Plans im Vergleich zu anderen Plänen verwendet.
Berechtigungen
Zur Verwendung von SET SHOWPLAN_ALL benötigen Sie für die Ausführung der Anweisungen, auf die SET SHOWPLAN_ALL angewendet wird, ausreichende Berechtigungen sowie die SHOWPLAN-Berechtigung für alle Datenbanken mit Objekten, auf die verwiesen wird.
Damit die Anweisungen SELECT, INSERT, UPDATE, DELETE, EXEC stored_procedure und EXEC user_defined_function einen Showplan erstellen, benötigt der Benutzer Folgendes:
Die Berechtigungen für die Ausführung der Transact-SQL-Anweisungen
Die SHOWPLAN-Berechtigung für alle Datenbanken mit Objekten, auf die von den Transact-SQL-Anweisungen verwiesen wird, wie z. B. Tabellen, Sichten usw.
Für alle anderen Anweisungen, z. B. DDL, USE database_name, SET, DECLARE, dynamische SQL-Anweisungen usw, werden nur die entsprechenden Berechtigungen für die Ausführung der Transact-SQL-Anweisungen benötigt.
Beispiele
In den beiden folgenden Anweisungen werden die SET SHOWPLAN_ALL-Einstellungen verwendet, um zu zeigen, wie SQL Server die Verwendung von Indizes in Abfragen analysiert und optimiert.
In der ersten Abfrage wird der Vergleichsoperator (=) in der WHERE-Klausel auf eine indizierte Spalte angewendet. Daher wird in der LogicalOp-Spalte der Wert Clustered Index Seek und in der Argument-Spalte der Indexname angezeigt.
In der zweiten Abfrage wird der LIKE-Operator in der WHERE-Klausel verwendet. Deshalb muss SQL Server eine Überprüfung des gruppierten Index ausführen und die Daten finden, die die Bedingung in der WHERE-Klausel erfüllen. Als Folge werden in der LogicalOp-Spalte der Wert Clustered Index Scan und in der Argument-Spalte der Indexname angezeigt. Weiterhin werden in der LogicalOp-Spalte der Wert Filter und in der Argument-Spalte die Bedingung aus der WHERE-Klausel angezeigt.
Die Werte in den Spalten EstimateRows und TotalSubtreeCost sind bei der ersten indizierten Abfrage kleiner, was auf eine deutlich schnellere Verarbeitung und die Verwendung weniger Ressourcen als bei der nicht indizierten Abfrage hinweist.
USE AdventureWorks2022;
GO
SET SHOWPLAN_ALL ON;
GO
-- First query.
SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
-- Second query.
SELECT BusinessEntityID, EmergencyContactID
FROM HumanResources.Employee
WHERE EmergencyContactID LIKE '1%';
GO
SET SHOWPLAN_ALL OFF;
GO
Weitere Informationen
SET-Anweisungen (Transact-SQL)
SET SHOWPLAN_TEXT (Transact-SQL)
SET SHOWPLAN_XML (Transact-SQL)