SET SHOWPLAN_ALL (Transact-SQL)
Bewirkt, dass SQL ServerTransact-SQL-Anweisungen nicht ausführt. Stattdessen gibt SQL Server detaillierte Informationen darüber zurück, wie die Anweisungen ausgeführt werden, und stellt Schätzungen zu Ressourcenanforderungen für die Anweisungen bereit.
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 Informationen zur Ausführung jeder Anweisung zurück, ohne sie jedoch 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 Benutzer informiert 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 seine Ausgabe verarbeiten. Verwenden Sie SET SHOWPLAN_TEXT, um eine lesbare Ausgabe für Microsoft Win32-Eingabeaufforderungsanwendungen, wie z. B. das Dienstprogramm 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_ALL gibt ein Rowset in Form einer hierarchischen Baumstruktur zurück, die zeigt, welche Schritte vom SQL Server-Abfrageprozessor beim Ausführen einer Anweisung ausgeführt werden. 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 Logische und physikalische Operatoren (Referenz). |
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 voraussichtlich verwendet 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 Abfrageplanes führte. Weitere Informationen zum Erstellen und Aktualisieren einer Spaltenstatistik (sie ermöglicht dem Abfrageoptimierer die Auswahl eines effizienteren Ausführungsplanes) finden Sie unter UPDATE STATISTICS. Diese Spalte kann optional die Zeichenfolge "MISSING JOIN PREDICATE" enthalten. Sie gibt an, dass eine Verknüpfung (mit Tabellen) ohne Verknüpfungsprädikat vorgenommen wird. Das unbeabsichtigte Löschen eines Verknüpfungsprä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 Verknüpfungsprä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
Für die Verwendung von SET SHOWPLAN_ALL benötigen Sie ausreichende Berechtigungen zum Ausführen der Anweisungen, auf die SET SHOWPLAN_ALL angewendet wird. Außerdem benötigen Sie für alle Datenbanken mit Objekten, auf die verwiesen wird, die SHOWPLAN-Berechtigung.
Damit die Anweisungen SELECT, INSERT, UPDATE, DELETE, EXEC stored_procedure und EXEC user_defined_function einen Showplan erstellen, benötigt der Benutzer Folgendes:
Berechtigungen für die Ausführung der Transact-SQL-Anweisungen.
SHOWPLAN-Berechtigung für alle Datenbanken mit Objekten, auf die in den Transact-SQL-Anweisungen verwiesen wird, wie z. B. Tabellen, Sichten usw.
Für alle anderen Anweisungen, wie 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.
Weitere Informationen finden Sie unter Showplansicherheit und SHOWPLAN-Berechtigung und Transact-SQL-Batches.
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 Gleich (=) 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 einen Scan 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 AdventureWorks;
GO
SET SHOWPLAN_ALL ON;
GO
-- First query.
SELECT EmployeeID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
-- Second query.
SELECT EmployeeID, EmergencyContactID
FROM HumanResources.Employee
WHERE EmergencyContactID LIKE '1%';
GO
SET SHOWPLAN_ALL OFF;
GO