Wie kann ich in Microsoft SQL Server einen Ausführungsplan für eine Abfrage / gespeicherte Prozedur abrufen?
338
Wie kann ich in Microsoft SQL Server einen Ausführungsplan für eine Abfrage / gespeicherte Prozedur abrufen?
Antworten:
Es gibt eine Reihe von Methoden, um einen Ausführungsplan zu erhalten, die von Ihren Umständen abhängen. Normalerweise können Sie SQL Server Management Studio verwenden, um einen Plan abzurufen. Wenn Sie Ihre Abfrage jedoch aus irgendeinem Grund nicht in SQL Server Management Studio ausführen können, ist es möglicherweise hilfreich, einen Plan über SQL Server Profiler oder durch Überprüfen abzurufen der Plan-Cache.
Methode 1 - Verwenden von SQL Server Management Studio
SQL Server verfügt über einige nützliche Funktionen, mit denen Sie einen Ausführungsplan sehr einfach erfassen können. Stellen Sie einfach sicher, dass das Menüelement "Aktuellen Ausführungsplan einschließen" (im Menü "Abfrage" enthalten) aktiviert ist, und führen Sie Ihre Abfrage wie gewohnt aus .
Wenn Sie versuchen, den Ausführungsplan für Anweisungen in einer gespeicherten Prozedur abzurufen, sollten Sie die gespeicherte Prozedur wie folgt ausführen:
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 - Verwenden von SHOWPLAN-Optionen
Diese Methode ist Methode 1 sehr ähnlich (tatsächlich ist dies das, was SQL Server Management Studio intern tut), ich habe sie jedoch der Vollständigkeit halber aufgenommen oder wenn Sie nicht über SQL Server Management Studio verfügen.
Führen Sie eine der folgenden Anweisungen aus, bevor Sie Ihre Abfrage ausführen . Die Anweisung muss die einzige Anweisung im Stapel sein, dh Sie können nicht gleichzeitig eine andere Anweisung ausführen:
Dies sind Verbindungsoptionen, sodass Sie diese nur einmal pro Verbindung ausführen müssen. Ab diesem Zeitpunkt werden alle ausgeführten Anweisungen von einer zusätzlichen Ergebnismenge begleitet, die Ihren Ausführungsplan im gewünschten Format enthält. Führen Sie Ihre Abfrage einfach wie gewohnt aus , um den Plan anzuzeigen .
Sobald Sie fertig sind, können Sie diese Option mit der folgenden Anweisung deaktivieren:
Vergleich der Ausführungsplanformate
Sofern Sie keine starke Präferenz haben, empfehle ich, die
STATISTICS XML
Option zu verwenden. 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 grundlegenden textbasierten geschätzten Ausführungsplan an, ohne die Abfrage auszuführenSHOWPLAN_ALL
- Zeigt einen textbasierten geschätzten Ausführungsplan mit Kostenschätzungen an, ohne die Abfrage auszuführenSHOWPLAN_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 einschließen" in SQL Server Management Studio.Methode 3 - Verwenden von SQL Server Profiler
Wenn Sie Ihre Abfrage nicht direkt ausführen können (oder wenn Ihre Abfrage nicht direkt ausgeführt wird, wenn Sie sie direkt ausführen - denken Sie daran, dass ein Plan für die Abfrage schlecht ausgeführt werden soll), können Sie einen Plan mithilfe eines SQL Server Profiler-Trace erfassen. Die Idee ist, Ihre Abfrage auszuführen, während ein Trace ausgeführt wird, der eines der "Showplan" -Ereignisse erfasst.
Beachten Sie, dass je nach Last Sie können diese Methode auf einer Produktionsumgebung verwenden, aber Sie sollten offensichtlich Vorsicht walten lassen. Die SQL Server Profilierungsmechanismen sind so konzipiert , Auswirkungen auf die Datenbank zu minimieren , aber dies bedeutet nicht , dass es nicht irgendwelche Auswirkungen auf die Leistung. Möglicherweise haben Sie auch Probleme beim Filtern und Identifizieren des richtigen Plans in Ihrer Ablaufverfolgung, wenn Ihre Datenbank stark beansprucht wird. Sie sollten sich natürlich bei Ihrem DBA erkundigen, ob er mit Ihnen in seiner wertvollen Datenbank zufrieden ist!
Der Plan, den Sie erhalten, entspricht der Option "Aktuellen Ausführungsplan einschließen" in SQL Server Management Studio.
Methode 4 - Überprüfen des Abfragecaches
Wenn Sie Ihre Abfrage nicht direkt ausführen können und auch keinen Profiler-Trace erfassen können, können Sie dennoch einen geschätzten Plan erhalten, indem Sie den SQL-Abfrageplan-Cache überprüfen.
Wir überprüfen den Plan-Cache, indem wir SQL Server- DMVs abfragen . Im Folgenden finden Sie eine grundlegende Abfrage, in der alle zwischengespeicherten Abfragepläne (als XML) zusammen mit ihrem SQL-Text aufgelistet werden. In den meisten Datenbanken müssen Sie außerdem zusätzliche Filterklauseln hinzufügen, um die Ergebnisse auf die Pläne zu filtern, an denen Sie interessiert sind.
Führen Sie diese Abfrage aus und klicken Sie auf das 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 es so viele Faktoren gibt (von der Tabelle und dem Indexschema bis zu den gespeicherten Daten und den Tabellenstatistiken), sollten Sie immer versuchen, einen Ausführungsplan aus der Datenbank zu erhalten, an der Sie interessiert sind (normalerweise diejenige, bei der eine Leistung auftritt Problem).
Sie können keinen Ausführungsplan für verschlüsselte gespeicherte Prozeduren erfassen.
"tatsächliche" vs "geschätzte" Ausführungspläne
Ein tatsächlicher Ausführungsplan ist einer, bei dem SQL Server die Abfrage tatsächlich ausführt , während ein geschätzter Ausführungsplan SQL Server herausfindet, was er ohne Ausführung der Abfrage tun würde . Obwohl logisch äquivalent, ist ein tatsächlicher Ausführungsplan viel nützlicher, da er zusätzliche Details und Statistiken darüber enthält, was bei der Ausführung der Abfrage tatsächlich passiert ist. Dies ist wichtig, wenn Sie Probleme diagnostizieren, bei denen die Schätzungen von SQL Servern nicht korrekt sind (z. B. wenn Statistiken nicht mehr aktuell sind).
Wie interpretiere ich einen Abfrageausführungsplan?
Dies ist ein Thema, das für ein (kostenloses) Buch an sich würdig genug ist .
Siehe auch:
quelle
SET STATISTICS XML ON
Setzen Sie den Anfang der Abfrage und dieSET STATISTICS XML OFF|ON
umgebenden Bereiche, die nicht in der Planausgabe angezeigt werden sollen: Ich fand dies nützlich, wenn die Abfrage eine Iteration (WHILE) enthält, die Sie nicht möchten / benötigen im Ausführungsplan zu sehen (sonst wäre es zu schwer und zu lang für SQL Server, um es anzuzeigen).Zusätzlich zu der bereits veröffentlichten umfassenden Antwort ist es manchmal nützlich, programmgesteuert auf den Ausführungsplan zugreifen zu können, um Informationen zu extrahieren. Beispielcode dafür ist unten.
Beispiel
StartCapture
DefinitionBeispiel
StopCapture
Definitionquelle
quelle
Neben den in den vorherigen Antworten beschriebenen Methoden können Sie auch einen kostenlosen Ausführungsplan-Viewer und ein Abfrageoptimierungstool ApexSQL Plan verwenden (auf das ich kürzlich gestoßen bin).
Sie können ApexSQL Plan installieren und in SQL Server Management Studio integrieren, sodass Ausführungspläne direkt von SSMS aus angezeigt werden können.
Anzeigen der geschätzten Ausführungspläne in ApexSQL Plan
Anzeigen der tatsächlichen Ausführungspläne in ApexSQL Plan
Um den tatsächlichen Ausführungsplan einer Abfrage anzuzeigen, fahren Sie mit dem zuvor erwähnten zweiten Schritt fort. Klicken Sie nun, sobald der geschätzte Plan angezeigt wird, in der Hauptleiste von ApexSQL Plan auf die Schaltfläche „Ist“.
Sobald Sie auf die Schaltfläche „Ist“ klicken, wird der Ist-Ausführungsplan mit einer detaillierten Vorschau der Kostenparameter zusammen mit anderen Ausführungsplandaten angezeigt.
Weitere Informationen zum Anzeigen von Ausführungsplänen finden Sie unter diesem Link .
quelle
Mein Lieblingswerkzeug zum Abrufen und gründlichen Analysieren von Abfrageausführungsplänen ist SQL Sentry Plan Explorer . Es ist viel benutzerfreundlicher, bequemer und umfassender für die Detailanalyse und Visualisierung von Ausführungsplänen als SSMS.
Hier ist ein Beispiel-Screenshot, damit Sie eine Vorstellung davon bekommen, welche Funktionen das Tool bietet:
Dies ist nur eine der im Tool verfügbaren Ansichten. Beachten Sie eine Reihe von Registerkarten am unteren Rand des App-Fensters, mit denen Sie verschiedene Arten Ihrer Ausführungsplandarstellung und nützliche zusätzliche Informationen abrufen können.
Darüber hinaus habe ich keine Einschränkungen der kostenlosen Edition festgestellt, die die tägliche Verwendung verhindern oder Sie dazu zwingen, die Pro-Version zu erwerben. Wenn Sie sich also lieber an die kostenlose Edition halten, verbietet Ihnen nichts, dies zu tun.
UPDATE: (Dank an Martin Smith ) Plan Explorer ist jetzt kostenlos! Weitere Informationen finden Sie unter http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view .
quelle
Speaking of third-party tools
als niemand Tools von Drittanbietern erwähnte.Abfragepläne können über das
query_post_execution_showplan
Ereignis aus einer Sitzung für erweiterte Ereignisse abgerufen werden . Hier ist eine XEvent-Beispielsitzung:Nachdem Sie die Sitzung erstellt haben, gehen Sie (in SSMS) zum Objekt-Explorer und gehen Sie zu Management | Erweiterte Ereignisse | Sitzungen. Klicken Sie mit der rechten Maustaste auf die Sitzung "GetExecutionPlan" und starten Sie sie. Klicken Sie erneut mit der rechten Maustaste darauf und wählen Sie "Live-Daten ansehen".
Öffnen Sie als Nächstes ein neues Abfragefenster und führen Sie eine oder mehrere Abfragen aus. Hier ist eine für AdventureWorks:
Nach ein oder zwei Augenblicken sollten auf der Registerkarte "GetExecutionPlan: Live Data" einige Ergebnisse angezeigt werden. Klicken Sie auf eines der Ereignisse query_post_execution_showplan im Raster und dann auf die Registerkarte "Abfrageplan" unter dem Raster. Es sollte ungefähr so aussehen:
EDIT : Der XEvent - Code und die Screenshot wurden von SQL / SSMS 2012 w / SP2 erzeugt. Wenn Sie SQL 2008 / R2 verwenden, können Sie das Skript möglicherweise optimieren, damit es ausgeführt wird. Da diese Version jedoch keine grafische Benutzeroberfläche hat, müssen Sie das Showplan-XML extrahieren, als * .sqlplan-Datei speichern und in SSMS öffnen. Das ist umständlich. XEvents war in SQL 2005 oder früher nicht vorhanden. Wenn Sie nicht mit SQL 2012 oder höher arbeiten, würde ich dringend eine der anderen hier veröffentlichten Antworten empfehlen.
quelle
Ab SQL Server 2016+ wurde die Query Store-Funktion eingeführt, um die Leistung zu überwachen. Es bietet Einblick in die Auswahl und Leistung des Abfrageplans. Es ist kein vollständiger Ersatz für Trace- oder erweiterte Ereignisse, aber da es sich von Version zu Version weiterentwickelt, erhalten wir möglicherweise in zukünftigen Versionen von SQL Server einen voll funktionsfähigen Abfragespeicher. Der primäre Ablauf des Abfragespeichers
Aktivieren des Abfragespeichers : Der Abfragespeicher funktioniert auf Datenbankebene auf dem Server.
tempdb
Datenbank nicht aktivieren .Sammeln von Informationen im Abfragespeicher : Wir erfassen alle verfügbaren Informationen aus den drei Speichern mithilfe von Query Store DMV (Data Management Views).
Abfrageplanspeicher : Behalten Sie die Ausführungsplaninformationen bei und es ist verantwortlich für die Erfassung aller Informationen, die sich auf die Abfragekompilierung beziehen.
Runtime Stats Store: Die Informationen zur Ausführungsstatistik bleiben erhalten und es handelt sich wahrscheinlich um den am häufigsten aktualisierten Speicher. Diese Statistiken repräsentieren Abfrageausführungsdaten.
Abfragestatistikspeicher speichern: Wartestatistikinformationen beibehalten und erfassen.
ANMERKUNG: Der Abfragestatistikspeicher ist nur in SQL Server 2017+ verfügbar
quelle
Wie bei SQL Server Management Studio (bereits erläutert) ist es auch bei Datagrip möglich, wie hier erläutert .
quelle
Hier ist eine wichtige Sache zu wissen, zusätzlich zu allem, was zuvor gesagt wurde.
Abfragepläne sind häufig zu komplex, um durch den integrierten XML- Spaltentyp dargestellt zu werden, der auf 127 Ebenen verschachtelter Elemente beschränkt ist. Dies ist einer der Gründe, warum sys.dm_exec_query_plan
NULL
in früheren MS SQL-Versionen möglicherweise einen Fehler zurückgibt oder sogar auslöst. Daher ist es im Allgemeinen sicherer, stattdessen sys.dm_exec_text_query_plan zu verwenden. Letzteres bietet auch eine nützliche Bonusfunktion für die Auswahl eines Plans für eine bestimmte Abrechnung anstelle der gesamten Charge. So verwenden Sie es, um Pläne für aktuell ausgeführte Anweisungen anzuzeigen:Die Textspalte in der resultierenden Tabelle ist jedoch im Vergleich zu einer XML-Spalte nicht sehr praktisch. Um auf das Ergebnis zu klicken, das in einer separaten Registerkarte als Diagramm geöffnet werden soll, ohne den Inhalt in einer Datei speichern zu müssen, können Sie einen kleinen Trick verwenden (denken Sie daran, dass Sie nicht nur verwenden können
CAST(... AS XML)
), obwohl dies nur für a funktioniert einzelne Reihe:quelle
Geschätzter Ausführungsplan
Der geschätzte Ausführungsplan wird vom Optimierer generiert, ohne die SQL-Abfrage auszuführen.
Um den geschätzten Ausführungsplan zu erhalten, müssen Sie den aktivieren
SHOWPLAN_ALL
Einstellung , bevor Sie die Abfrage ausführen.SET SHOWPLAN_ALL ON
Wenn Sie nun die folgende SQL-Abfrage ausführen:
SQL Server generiert den folgenden geschätzten Ausführungsplan:
Nach dem Ausführen der Abfrage möchten wir den geschätzten Ausführungsplan abrufen. Sie müssen den deaktivieren,
SHOWPLAN_ALL
da andernfalls die aktuelle Datenbanksitzung nur den geschätzten Ausführungsplan generiert, anstatt die bereitgestellten SQL-Abfragen auszuführen.Geschätzter Plan von SQL Server Management Studio
In der SQL Server Management Studio-Anwendung können Sie den geschätzten Ausführungsplan für jede SQL-Abfrage einfach abrufen, indem Sie auf die
CTRL+L
Tastenkombination klicken.Tatsächlicher Ausführungsplan
Der eigentliche SQL-Ausführungsplan wird vom Optimierer beim Ausführen der SQL-Abfrage generiert. Wenn die Datenbanktabellenstatistiken korrekt sind, sollte der tatsächliche Plan nicht wesentlich vom geschätzten Plan abweichen.
Um den tatsächlichen Ausführungsplan für SQL Server abzurufen, müssen Sie die
STATISTICS IO, TIME, PROFILE
Einstellungen aktivieren , wie im folgenden SQL-Befehl dargestellt:Wenn Sie nun die vorherige Abfrage ausführen, generiert SQL Server den folgenden Ausführungsplan:
Nachdem Sie die Abfrage ausgeführt haben, möchten wir den tatsächlichen Ausführungsplan erhalten. Sie müssen die
STATISTICS IO, TIME, PROFILE ON
Einstellungen wie folgt deaktivieren :Aktueller Plan für SQL Server Management Studio
In der SQL Server Management Studio-Anwendung können Sie den geschätzten Ausführungsplan für jede SQL-Abfrage einfach abrufen, indem Sie auf die
CTRL+M
Tastenkombination klicken.quelle
Sie können dies auch über Powershell mit SET STATISTICS XML ON tun, um den tatsächlichen Plan abzurufen. Ich habe es so geschrieben, dass es Pläne mit mehreren Anweisungen zu einem Plan zusammenführt.
quelle
Das Erklären des Ausführungsplans kann sehr detailliert sein und nimmt eine beträchtliche Lesezeit in Anspruch. Wenn Sie jedoch vor der Abfrage 'EXPLAIN' verwenden, sollten Sie viele Informationen erhalten, einschließlich der Teile, die zuerst ausgeführt wurden, und so weiter. Wenn Sie ein bisschen mehr Details dazu lesen möchten, habe ich einen kleinen Blog darüber zusammengestellt, der Sie auch auf die richtigen Refs hinweist. https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470
quelle