it-swarm.com.de

Wie erhalte ich einen Abfrageausführungsplan?

Wie kann ich in Microsoft SQL Server einen Abfrageausführungsplan für eine Abfrage/gespeicherte Prozedur abrufen?

327
Justin

Es gibt eine Reihe von Methoden zum Abrufen eines Ausführungsplans, 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

In SQL Server sind einige nützliche Funktionen enthalten, mit denen Sie einen Ausführungsplan ganz einfach erfassen können. Stellen Sie einfach sicher, dass das Menüelement "Aktuellen Ausführungsplan einschließen" (im Menü "Abfrage") aktiviert ist, und führen Sie Ihre Abfrage wie gewohnt aus .

Include Action Execution Plan menu item

Wenn Sie versuchen, den Ausführungsplan für Anweisungen in einer gespeicherten Prozedur abzurufen, sollten Sie die gespeicherte Prozedur folgendermaßen ausführen:

exec p_Example 42

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

Screenshot of an Execution Plan

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), jedoch habe ich sie 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, 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 Sie müssen diese nur einmal pro Verbindung ausführen. 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 siehe den plan.

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

SET <<option>> OFF

Vergleich der Ausführungsplanformate

Sofern Sie keine starke Präferenz haben, ist meine Empfehlung, die Option STATISTICS XML zu verwenden. Diese Option entspricht der Option "Aktuellen Ausführungsplan einschließen" in SQL Server Management Studio und bietet die meisten Informationen im bequemsten Format.

  • SHOWPLAN_TEXT - Zeigt einen 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 - Verwenden von SQL Server Profiler

Wenn Sie Ihre Abfrage nicht direkt ausführen können (oder wenn Sie sie direkt ausführen, wird die Abfrage nicht langsam ausgeführt - denken Sie daran, dass ein Plan mit einer schlechten Leistung der Abfrage gewünscht wird), können Sie einen Plan mithilfe einer SQL Server Profiler-Ablaufverfolgung erfassen. Die Idee ist, Ihre Abfrage auszuführen, während ein Trace ausgeführt wird, der eines der "Showplan" -Ereignisse aufzeichnet.

Beachten Sie, dass Sie diese Methode je nach Auslastung in einer Produktionsumgebung anwenden können . Sie sollten jedoch natürlich Vorsicht walten lassen. Die SQL Server-Profilierungsmechanismen sollen die Auswirkungen auf die Datenbank minimieren. Dies bedeutet jedoch nicht, dass die Leistung nicht durchoderbeeinträchtigt wird. 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 Datenbankadministrator erkundigen, ob er mit Ihnen in seiner wertvollen Datenbank zufrieden ist.

  1. Öffnen Sie SQL Server Profiler und erstellen Sie eine neue Ablaufverfolgung, die eine Verbindung zu der gewünschten Datenbank herstellt, für die Sie die Ablaufverfolgung aufzeichnen möchten.
  2. Überprüfen Sie auf der Registerkarte "Ereignisauswahl" unter "Alle Ereignisse anzeigen" die Zeile "Leistung" -> "Showplan XML" und führen Sie den Trace aus.
  3. Führen Sie, während der Trace ausgeführt wird, alle erforderlichen Schritte aus, um die langsam laufende Abfrage auszuführen.
  4. Warten Sie, bis die Abfrage abgeschlossen ist, und stoppen Sie die Ablaufverfolgung.
  5. Um den Trace zu speichern, klicken Sie 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 einbeziehen" in SQL Server Management Studio.

Methode 4 - Überprüfen 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 erhalten, indem Sie den SQL-Abfrageplan-Cache überprüfen.

Wir untersuchen den Plan-Cache, indem wir SQL Server DMVs abfragen. Das Folgende ist eine grundlegende Abfrage, die alle zwischengespeicherten Abfragepläne (als XML) zusammen mit ihrem SQL-Text auflistet. In den meisten Datenbanken müssen Sie auch zusätzliche Filterklauseln hinzufügen, um die Ergebnisse auf die gewünschten Pläne herunterzufiltern.

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 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 sich um so viele Faktoren handelt (vom Tabellen- und Indexschema bis hin zu den gespeicherten Daten und den Tabellenstatistiken), sollten Sie immer versuchen, eine zu erhalten Ausführungsplan aus der Datenbank, an der Sie interessiert sind (normalerweise derjenige, bei dem ein Leistungsproblem auftritt).

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

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

EintatsächlicherAusführungsplan ist einer, bei dem SQL Server die Abfrage tatsächlich ausführt, während eingeschätzterAusführungsplan von SQL Server berechnet wird, was ertun würdeohne die Abfrage auszuführen. Obwohl logisch äquivalent, ist ein tatsächlicher Ausführungsplan viel nützlicher, da er zusätzliche Details und Statistiken darüber enthält, was beim Ausführen der Abfrage tatsächlich passiert ist. Dies ist wichtig, wenn Probleme diagnostiziert werden, bei denen die Schätzungen von SQL Server nicht zutreffen (z. B. wenn Statistiken nicht mehr aktuell sind).

Wie interpretiere ich einen Abfrageausführungsplan?

Dies ist ein Thema, das für sich genommen für ein (freies) Buch ausreicht.

Siehe auch:

486
Justin

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.

DECLARE @TraceID INT
EXEC StartCapture @@SPID, @TraceID OUTPUT
EXEC sp_help 'sys.objects' /*<-- Call your stored proc of interest here.*/
EXEC StopCapture @TraceID

Beispiel StartCapture Definition

CREATE PROCEDURE StartCapture
@Spid INT,
@TraceID INT OUTPUT
AS
DECLARE @maxfilesize BIGINT = 5
DECLARE @filepath NVARCHAR(200) = N'C:\trace_' + LEFT(NEWID(),36)

EXEC sp_trace_create @TraceID OUTPUT, 0, @filepath, @maxfilesize, NULL 

exec sp_trace_setevent @TraceID, 122, 1, 1
exec sp_trace_setevent @TraceID, 122, 22, 1
exec sp_trace_setevent @TraceID, 122, 34, 1
exec sp_trace_setevent @TraceID, 122, 51, 1
exec sp_trace_setevent @TraceID, 122, 12, 1
-- filter for spid
EXEC sp_trace_setfilter @TraceID, 12, 0, 0, @Spid
-- start the trace
EXEC sp_trace_setstatus @TraceID, 1

Beispiel StopCapture Definition

CREATE  PROCEDURE StopCapture
@TraceID INT
AS
WITH  XMLNAMESPACES ('http://schemas.Microsoft.com/sqlserver/2004/07/showplan' as sql), 
      CTE
     as (SELECT CAST(TextData AS VARCHAR(MAX)) AS TextData,
                ObjectID,
                ObjectName,
                EventSequence,
                /*costs accumulate up the tree so the MAX should be the root*/
                MAX(EstimatedTotalSubtreeCost) AS EstimatedTotalSubtreeCost
         FROM   fn_trace_getinfo(@TraceID) fn
                CROSS APPLY fn_trace_gettable(CAST(value AS NVARCHAR(200)), 1)
                CROSS APPLY (SELECT CAST(TextData AS XML) AS xPlan) x
                CROSS APPLY (SELECT T.relop.value('@EstimatedTotalSubtreeCost',
                                            'float') AS EstimatedTotalSubtreeCost
                             FROM   xPlan.nodes('//sql:RelOp') T(relop)) ca
         WHERE  property = 2
                AND TextData IS NOT NULL
                AND ObjectName not in ( 'StopCapture', 'fn_trace_getinfo' )
         GROUP  BY CAST(TextData AS VARCHAR(MAX)),
                   ObjectID,
                   ObjectName,
                   EventSequence)
SELECT ObjectName,
       SUM(EstimatedTotalSubtreeCost) AS EstimatedTotalSubtreeCost
FROM   CTE
GROUP  BY ObjectID,
          ObjectName  

-- Stop the trace
EXEC sp_trace_setstatus @TraceID, 0
-- Close and delete the trace
EXEC sp_trace_setstatus @TraceID, 2
GO
40
Martin Smith

Angenommen, Sie verwenden Microsoft SQL Server Management Studio

  • Für einen geschätzten Abfrageplan können Sie Strg + L oder die folgende Schaltfläche drücken .

enter image description here

  • Für Tatsächlicher Abfrageplan können Sie Strg + M oder Folgendes drücken Schaltfläche, bevor die Abfrage ausgeführt wird.

enter image description here

  • Verwenden Sie für Live Query Plan (nur in SSMS 2016) die folgende Schaltfläche, bevor Sie die Abfrage ausführen.

enter image description here

17
Tigerjz32

Neben den in den vorherigen Antworten beschriebenen Methoden können Sie auch einen kostenlosen Ausführungsplan-Viewer und ein Abfrageoptimierungstool verwenden ApexSQL Plan (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 in SSMS angezeigt werden können.

Geschätzte Ausführungspläne in ApexSQL Plan anzeigen

  1. Klicken Sie in SSMS auf die Schaltfläche Neue Abfrage und fügen Sie den Abfragetext in das Abfragetextfenster ein. Klicken Sie mit der rechten Maustaste und wählen Sie im Kontextmenü die Option "Geschätzten Ausführungsplan anzeigen".

New Query button in SSMS

  1. Die Ausführungsplandiagramme werden auf der Registerkarte Ausführungsplan im Ergebnisbereich angezeigt. Klicken Sie anschließend mit der rechten Maustaste auf den Ausführungsplan und wählen Sie im Kontextmenü die Option „In ApexSQL Plan öffnen“.

Execution Plan

  1. Der geschätzte Ausführungsplan wird in ApexSQL Plan geöffnet und kann zur Abfrageoptimierung analysiert werden.

Estimated execution plan

Anzeigen der aktuellen 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. Sobald der geschätzte Plan angezeigt wird, klicken Sie in der Hauptleiste von ApexSQL Plan auf die Schaltfläche „Actual“.

click the “Actual” button from the main ribbon bar

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.

Actual execution plan

Weitere Informationen zum Anzeigen von Ausführungsplänen finden Sie unter dieser Link .

15
Marcin Czyz

Mein Lieblingswerkzeug zum Abrufen und 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:

SQL Sentry Plan Explorer window screen shot

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 sowie nützliche zusätzliche Informationen abrufen können.

Außerdem habe ich keine Einschränkungen der kostenlosen Version bemerkt, die die tägliche Verwendung verhindern oder Sie zwingen, die Pro-Version zu kaufen. Wenn Sie sich also lieber an die kostenlose Edition halten möchten, steht Ihnen nichts im Wege.

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 .

13

Abfragepläne können aus einer Extended Events-Sitzung über das Ereignis query_post_execution_showplan abgerufen werden. Hier ist eine XEvent-Beispielsitzung:

/*
    Generated via "Query Detail Tracking" template.
*/
CREATE EVENT SESSION [GetExecutionPlan] ON SERVER 
ADD EVENT sqlserver.query_post_execution_showplan(
    ACTION(package0.event_sequence,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)),

/* Remove any of the following events (or include additional events) as desired. */
ADD EVENT sqlserver.error_reported(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.module_end(SET collect_statement=(1)
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.rpc_completed(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sp_statement_completed(SET collect_object_name=(1)
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))) 
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

Nachdem Sie die Sitzung erstellt haben, rufen Sie (in SSMS) den Objekt-Explorer auf und gehen Sie zu Management | Erweiterte Veranstaltungen | 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:

USE AdventureWorks;
GO

SELECT p.Name AS ProductName, 
    NonDiscountSales = (OrderQty * UnitPrice),
    Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p 
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID 
ORDER BY ProductName DESC;
GO

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" unterhalb des Rasters. Es sollte ungefähr so ​​aussehen:

enter image description here

EDIT: Der XEvent-Code und der Screenshot wurden aus SQL/SSMS 2012 mit SP2 generiert. Wenn Sie SQL 2008/R2 verwenden, können Sie möglicherweise das Skript optimieren, damit es ausgeführt wird. Diese Version verfügt jedoch nicht über eine grafische Benutzeroberfläche. Daher müssen Sie die Showplan-XML-Datei extrahieren, als * .sqlplan-Datei speichern und in SSMS öffnen. Das ist umständlich. XEvents gab es in SQL 2005 oder früher nicht. Wenn Sie nicht mit SQL 2012 oder höher arbeiten, empfehle ich dringend eine der anderen Antworten, die Sie hier finden.

7
Dave Mason

Ab SQL Server 2016+ wurde die Abfrage-Speicher-Funktion eingeführt, um die Leistung zu überwachen. Es bietet Einblick in die Auswahl und Leistung von Abfrageplänen. Es ist kein vollständiger Ersatz für Ablaufverfolgungs- oder erweiterte Ereignisse, aber da es von Version zu Version weiterentwickelt wird, erhalten wir in zukünftigen Versionen von SQL Server möglicherweise einen voll funktionsfähigen Abfragespeicher. Der primäre Ablauf des Abfragespeichers

  1. Vorhandene SQL Server-Komponenten interagieren mit dem Abfragespeicher, indem sie den Abfragespeicher-Manager verwenden.
  2. Der Abfragestore-Manager bestimmt, welcher Speicher verwendet werden soll, und übergibt die Ausführung an diesen Speicher (Plan- oder Laufzeitstatistik oder Abfragewartestatistik)
    • Plan Store - Die Informationen zum Ausführungsplan werden beibehalten
    • Runtime Stats Store - Behalten Sie die Informationen zur Ausführungsstatistik bei
    • Query Wait Stats Store - Bestehende Informationen zu Wartestatistiken.
  3. Plan, Runtime Stats und Wait Store verwenden Query Store als Erweiterung für SQL Server.

enter image description here

  1. Aktivieren des Abfragespeichers : Der Abfragespeicher funktioniert auf Datenbankebene auf dem Server.

    • Der Abfragespeicher ist für neue Datenbanken standardmäßig nicht aktiv.
    • Sie können den Abfragespeicher nicht für den Master oder die Datenbank tempdb aktivieren.
    • Verfügbares DMV

      sys.database_query_store_options (Transact-SQL)

  2. Sammeln von Informationen im Abfragespeicher : Wir sammeln alle verfügbaren Informationen aus den drei Speichern mithilfe von DMV (Data Management Views) für den Abfragespeicher.

    • Abfrageplanspeicher: Behalten Sie die Ausführungsplaninformationen bei, und Sie sind für die Erfassung aller Informationen im Zusammenhang mit der Abfragekompilierung verantwortlich.

      sys.query_store_query (Transact-SQL) sys.query_store_plan (Transact-SQL) sys.query_store_query_text (Transact-SQL )

    • Laufzeitstatistikspeicher: Behalten Sie die Ausführungsstatistikinformationen bei und es ist wahrscheinlich der am häufigsten aktualisierte Speicher. Diese Statistiken stellen Abfrageausführungsdaten dar.

      sys.query_store_runtime_stats (Transact-SQL)

    • Speicher für Wartestatistiken abfragen: Informationen zu Wartestatistiken beibehalten und erfassen.

      sys.query_store_wait_stats (Transact-SQL)

HINWEIS: Der Speicher für Abfragewartestatistiken ist nur in SQL Server 2017+ verfügbar

5
vCillusion

Wie bei SQL Server Management Studio (bereits erläutert) ist es auch bei Datagrip möglich, wie erläutert hier .

  1. Klicken Sie mit der rechten Maustaste auf eine SQL-Anweisung, und wählen Sie Plan erläutern aus.
  2. Klicken Sie im Ausgabebereich auf Plan.
  3. Standardmäßig wird die Baumdarstellung der Abfrage angezeigt. Klicken Sie zum Anzeigen des Abfrageplans auf das Symbol Visualisierung anzeigen oder drücken Sie Strg + Umschalt + Alt + U
3
Daan

Zusätzlich zu allem, was zuvor gesagt wurde, ist Folgendes zu beachten.

Abfragepläne sind häufig zu komplex, um durch den integrierten XML-Spaltentyp dargestellt zu werden, der eine Beschränkung von 127 Ebenen von verschachtelten Elementen aufweist. Dies ist einer der Gründe, warum sys.dm_exec_query_plan möglicherweise NULL zurückgibt oder in früheren MS SQL-Versionen sogar einen Fehler ausgibt. Daher ist es im Allgemeinen sicherer, sys.dm_exec_text_query_plan zu verwenden = stattdessen. Letzteres bietet auch eine nützliche Bonusfunktion für die Auswahl eines Plans für eine bestimmte Anweisung anstelle des gesamten Stapels. So zeigen Sie damit Pläne für derzeit ausgeführte Anweisungen an:

SELECT p.query_plan
FROM sys.dm_exec_requests AS r
OUTER APPLY sys.dm_exec_text_query_plan(
                r.plan_handle,
                r.statement_start_offset,
                r.statement_end_offset) AS p

Die Textspalte in der resultierenden Tabelle ist jedoch im Vergleich zu einer XML-Spalte nicht sehr praktisch. Um das zu öffnende Ergebnis in einer separaten Registerkarte als Diagramm anklicken zu können, ohne dessen Inhalt in einer Datei speichern zu müssen, können Sie einen kleinen Trick anwenden (denken Sie daran, Sie können nicht einfach CAST(... AS XML) verwenden), obwohl dies der Fall ist funktioniert nur für eine einzelne Zeile:

SELECT Tag = 1, Parent = NULL, [ShowPlanXML!1!!XMLTEXT] = query_plan
FROM sys.dm_exec_text_query_plan(
                -- set these variables or copy values
                -- from the results of the above query
                @plan_handle,
                @statement_start_offset,
                @statement_end_offset)
FOR XML EXPLICIT
3
alkoln

Das Erläutern des Ausführungsplans kann sehr detailliert sein und nimmt viel Zeit in Anspruch. Wenn Sie jedoch "EXPLAIN" vor der Abfrage verwenden, sollten Sie eine Reihe von Informationen erhalten, einschließlich der Teile, die zuerst ausgeführt wurden und so weiter. wenn du ein bisschen mehr darüber lesen willst, habe ich einen kleinen blog darüber zusammengestellt, der dich auch auf die richtigen refs hinweist. https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c47

0
Abd Rmdn