Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie erhalte ich einen Abfrageausführungsplan in SQL Server?

Es gibt eine Reihe von Methoden, um einen Ausführungsplan zu erhalten, welche Sie verwenden, hängt von Ihren Umständen ab. Normalerweise können Sie SQL Server Management Studio verwenden, um einen Plan zu erhalten, aber wenn Sie Ihre Abfrage aus irgendeinem Grund nicht in SQL Server Management Studio ausführen können, finden Sie es möglicherweise hilfreich, einen Plan über SQL Server Profiler oder durch Inspizieren zu erhalten den Plan-Cache.

Methode 1 – Verwenden von SQL Server Management Studio

SQL Server verfügt über ein paar nette Funktionen, die es sehr einfach machen, einen Ausführungsplan zu erfassen. Stellen Sie einfach sicher, dass das Menüelement „Aktuellen Ausführungsplan einschließen“ (unter dem Menü „Abfrage“) aktiviert ist, und führen Sie Ihre Abfrage wie gewohnt aus .

Wenn Sie versuchen, den Ausführungsplan für Anweisungen in einer gespeicherten Prozedur zu erhalten, sollten Sie die gespeicherte Prozedur wie folgt ausführen:

exec p_Example 42

Wenn Ihre Abfrage abgeschlossen ist, sollte im Ergebnisbereich eine zusätzliche Registerkarte mit dem Titel "Ausführungsplan" angezeigt werden. Wenn Sie viele Anweisungen ausgeführt haben, werden möglicherweise viele Pläne auf dieser Registerkarte angezeigt.

Von hier aus können Sie den Ausführungsplan in SQL Server Management Studio überprüfen oder mit der rechten Maustaste auf den Plan klicken und „Ausführungsplan speichern unter …“ auswählen, um den Plan in einer Datei im XML-Format zu speichern.

Methode 2 - SHOWPLAN-Optionen verwenden

Diese Methode ist Methode 1 sehr ähnlich (tatsächlich macht SQL Server Management Studio dies intern), ich habe sie jedoch der Vollständigkeit halber oder falls Sie SQL Server Management Studio nicht zur Verfügung haben, eingefügt.

Führen Sie eine aus, bevor Sie Ihre Abfrage ausführen der folgenden Aussagen. Die Anweisung muss die einzige Anweisung im Stapel sein, d. h. Sie können nicht gleichzeitig eine andere Anweisung ausführen:

SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

Dies sind Verbindungsoptionen und müssen daher nur einmal pro Verbindung ausgeführt werden. Ab diesem Zeitpunkt werden alle ausgeführten Anweisungen von einer zusätzlichen Ergebnismenge begleitet mit Ihrem Ausführungsplan im gewünschten Format - führen Sie einfach Ihre Abfrage so aus, wie Sie es normalerweise tun würden, um den Plan anzuzeigen.

Sobald Sie fertig sind, können Sie diese Option mit der folgenden Anweisung deaktivieren:

SET <<option>> OFF

Vergleich von Ausführungsplanformaten

Sofern Sie keine starke Präferenz haben, empfehle ich die Verwendung von STATISTICS XML Möglichkeit. Diese Option entspricht der Option „Aktuellen Ausführungsplan einschließen“ in SQL Server Management Studio und liefert die meisten Informationen im bequemsten Format.

  • SHOWPLAN_TEXT - Zeigt einen einfachen textbasierten geschätzten Ausführungsplan an, ohne die Abfrage auszuführen
  • SHOWPLAN_ALL - Zeigt einen textbasierten geschätzten Ausführungsplan mit Kostenschätzungen an, ohne die Abfrage auszuführen
  • SHOWPLAN_XML - Zeigt einen XML-basierten geschätzten Ausführungsplan mit Kostenschätzungen an, ohne die Abfrage auszuführen. Dies entspricht der Option "Geschätzten Ausführungsplan anzeigen..." in SQL Server Management Studio.
  • STATISTICS PROFILE - Führt die Abfrage aus und zeigt einen textbasierten tatsächlichen Ausführungsplan an.
  • STATISTICS XML - Führt die Abfrage aus und zeigt einen XML-basierten tatsächlichen Ausführungsplan an. Dies entspricht der Option „Aktuellen Ausführungsplan einbeziehen“ in SQL Server Management Studio.

Methode 3 – Verwendung von SQL Server Profiler

Wenn Sie Ihre Abfrage nicht direkt ausführen können (oder Ihre Abfrage nicht langsam ausgeführt wird, wenn Sie sie direkt ausführen – denken Sie daran, dass wir einen Plan der Abfrage mit schlechter Leistung wünschen), können Sie einen Plan mithilfe einer SQL Server Profiler-Ablaufverfolgung erfassen. Die Idee ist, Ihre Abfrage auszuführen, während eine Ablaufverfolgung läuft, die eines der "Showplan"-Ereignisse erfasst.

Beachten Sie, dass Sie je nach Belastung können Verwenden Sie diese Methode in einer Produktionsumgebung, aber Sie sollten natürlich Vorsicht walten lassen. Die Profilerstellungsmechanismen von SQL Server wurden entwickelt, um die Auswirkungen auf die Datenbank zu minimieren, aber das bedeutet nicht, dass keine vorhanden sind Auswirkungen auf die Leistung. Möglicherweise haben Sie auch Probleme beim Filtern und Identifizieren des richtigen Plans in Ihrer Ablaufverfolgung, wenn Ihre Datenbank stark ausgelastet ist. Sie sollten sich natürlich bei Ihrem DBA erkundigen, ob er damit einverstanden ist, dass Sie dies in seiner wertvollen Datenbank tun!

  1. Öffnen Sie SQL Server Profiler und erstellen Sie eine neue Ablaufverfolgung, die mit der gewünschten Datenbank verbunden ist, für die Sie die Ablaufverfolgung aufzeichnen möchten.
  2. Aktivieren Sie auf der Registerkarte "Ereignisauswahl" die Option "Alle Ereignisse anzeigen", aktivieren Sie die Zeile "Leistung" -> "Showplan XML" und führen Sie die Ablaufverfolgung aus.
  3. Während die Ablaufverfolgung ausgeführt wird, tun Sie alles, was Sie tun müssen, damit die langsam laufende Abfrage ausgeführt wird.
  4. Warten Sie, bis die Abfrage abgeschlossen ist, und beenden Sie die Verfolgung.
  5. Klicken Sie zum Speichern der Ablaufverfolgung mit der rechten Maustaste auf die Plan-XML in SQL Server Profiler und wählen Sie „Ereignisdaten extrahieren...“, um den Plan in einer Datei im XML-Format zu speichern.

Der Plan, den Sie erhalten, entspricht der Option „Aktuellen Ausführungsplan einschließen“ in SQL Server Management Studio.

Methode 4 – Überprüfung des Abfragecaches

Wenn Sie Ihre Abfrage nicht direkt ausführen und auch keine Profiler-Ablaufverfolgung erfassen können, können Sie dennoch einen geschätzten Plan abrufen, indem Sie den SQL-Abfrageplan-Cache untersuchen.

Wir untersuchen den Plancache, indem wir SQL Server-DMVs abfragen. Das Folgende ist eine einfache Abfrage, die alle zwischengespeicherten Abfragepläne (als XML) zusammen mit ihrem SQL-Text auflistet. Bei den meisten Datenbanken müssen Sie außerdem zusätzliche Filterklauseln hinzufügen, um die Ergebnisse nur auf die Pläne zu filtern, an denen Sie interessiert sind.

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

Führen Sie diese Abfrage aus und klicken Sie auf die Plan-XML, um den Plan in einem neuen Fenster zu öffnen - klicken Sie mit der rechten Maustaste und wählen Sie "Ausführungsplan speichern unter...", um den Plan in einer Datei im XML-Format zu speichern.

Anmerkungen:

Da so viele Faktoren beteiligt sind (vom Tabellen- und Indexschema bis hin zu den gespeicherten Daten und den Tabellenstatistiken), sollten Sie immer Versuchen Sie, einen Ausführungsplan von der Datenbank zu erhalten, an der Sie interessiert sind (normalerweise diejenige, bei der ein Leistungsproblem auftritt).

Sie können keinen Ausführungsplan für verschlüsselte gespeicherte Prozeduren erfassen.

"tatsächliche" vs. "geschätzte" Ausführungspläne

Eine tatsächliche Ausführungsplan ist einer, bei dem SQL Server die Abfrage tatsächlich ausführt, während ein geschätzter Ausführungsplan SQL Server rechnet aus, was er würde auf die Ausführung der Abfrage verzichten. Obwohl logisch gleichwertig, ist ein tatsächlicher Ausführungsplan viel nützlicher, da er zusätzliche Details und Statistiken darüber enthält, was tatsächlich passiert ist, als die Abfrage ausgeführt wurde. Dies ist wichtig, wenn Sie Probleme diagnostizieren, bei denen die Schätzungen von SQL Server falsch sind (z. B. wenn Statistiken veraltet sind).

  • Geschätzter und tatsächlicher Ausführungsplan überarbeitet

Wie interpretiere ich einen Abfrageausführungsplan?

Dies ist ein Thema, das ein eigenes (kostenloses) Buch wert ist.

Siehe auch:

  • Grundlagen des Ausführungsplans
  • SHOWPLAN-Berechtigung und Transact-SQL-Batches
  • SQL Server 2008 – Verwenden von Abfrage-Hashes und Abfrageplan-Hashes
  • Analysieren des SQL Server-Plan-Cache