Comment puis-je obtenir un Plan d'exécution de requête?

Dans Microsoft SQL Server Comment puis-je obtenir un plan d'exécution de requête pour une requête / procédure stockée?

307
demandé sur Alexander Abakumov 2011-09-09 13:37:21

9 réponses

Il existe un certain nombre de méthodes pour obtenir un plan d'exécution, lequel utiliser dépendra de votre situation. Vous pouvez généralement utiliser SQL Server Management Studio pour obtenir un plan, mais si, pour une raison quelconque, vous ne pouvez pas exécuter votre requête dans SQL Server Management Studio, vous trouverez peut-être utile d'obtenir un plan via SQL Server Profiler ou en inspectant le cache du plan.

Méthode 1-Utilisation de SQL Server Management Studio

SQL Server est livré avec quelques caractéristiques qui rendent très facile de capturer un plan d'exécution, assurez-vous simplement que L'élément de menu" inclure le Plan D'exécution réel "(trouvé sous le menu" requête") est coché et exécutez votre requête comme d'habitude.

Inclure L'élément de menu Plan D'exécution D'Action

Si vous essayez d'obtenir le plan d'exécution pour les instructions dans une procédure stockée, alors vous devez exécuter la procédure stockée, comme ceci:

exec p_Example 42

Lorsque votre requête est terminée, vous devriez voir un onglet supplémentaire intitulé "Plan D'exécution" apparaître dans les résultats volet. Si vous avez exécuté plusieurs instructions, vous pouvez voir de nombreux plans affichés dans cet onglet.

Capture d'écran D'un Plan D'exécution

De là, vous pouvez inspecter le plan d'exécution dans SQL Server Management Studio, ou faites un clic droit sur le plan et sélectionnez " Enregistrer le Plan D'exécution sous ..."pour enregistrer le plan dans un fichier au format XML.

Méthode 2-Utilisation des options SHOWPLAN

Cette méthode est très similaire à la méthode 1 (en fait, C'est ce que fait SQL Server Management Studio en interne), mais j'ai inclus pour être complet ou si vous N'avez pas SQL Server Management Studio disponible.

Avant d'exécuter votre requête, exécutez un des énoncés suivants. L'instruction doit être la seule instruction du lot, c'est-à-dire que vous ne pouvez pas exécuter une autre instruction en même temps:

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

Ce sont des options de connexion et vous n'avez donc besoin de l'exécuter qu'une seule fois par connexion. À partir de ce moment, toutes les instructions exécutées seront associées à un resultset supplémentaire contenant votre plan d'exécution dans le format désiré - lancez simplement votre requête comme vous le feriez normalement pour voir le plan.

Une Fois que vous avez terminé, vous pouvez désactiver cette option avec la déclaration suivante:

SET <<option>> OFF

Comparaison des formats de plans d'exécution

Sauf si vous avez une forte préférence, ma recommandation est d'utiliser l'option STATISTICS XML. Cette option est équivalente à L'option" Inclure le Plan D'exécution réel " dans SQL Server Management Studio et fournit le plus d'informations possible format pratique.

  • SHOWPLAN_TEXT - affiche un plan d'exécution estimé basé sur du texte de base, sans exécuter la requête
  • SHOWPLAN_ALL - affiche un plan d'exécution estimé basé sur du texte avec des estimations de coûts, sans exécuter la requête
  • SHOWPLAN_XML - affiche un plan D'exécution estimé basé sur XML avec des estimations de coûts, sans exécuter la requête. Ceci est équivalent au " plan D'exécution estimé D'affichage..."option dans SQL Server Management Studio.
  • STATISTICS PROFILE - Exécute la requête et affiche un plan d'exécution réel basé sur du texte.
  • STATISTICS XML - exécute la requête et affiche un plan D'exécution réel basé sur XML. Ceci est équivalent à L'option" Inclure le Plan D'exécution réel " dans SQL Server Management Studio.

Méthode 3-Utilisation du profileur SQL Server

Si vous ne pouvez pas exécuter votre requête directement (ou si votre requête ne s'exécute pas lentement lorsque vous l'exécutez directement-rappelez-vous que nous voulons un plan de la requête qui fonctionne mal), alors vous pouvez capturez un plan à l'aide D'une trace de profileur SQL Server. L'idée est d'exécuter votre requête pendant qu'une trace qui capture l'un des événements "Showplan" est en cours d'exécution.

Notez qu'en fonction de la charge vous peut utiliser cette méthode sur un environnement de production, cependant vous devez évidemment faire preuve de prudence. Les mécanismes de profilage SQL Server sont conçus pour minimiser l'impact sur la base de données, mais cela ne signifie pas qu'il n'y aura pas d'impact sur les performances. Vous pouvez également avoir des problèmes filtrer et identifier le plan correct dans votre trace si votre base de données est fortement utilisée. Vous devriez évidemment vérifier avec votre DBA pour voir s'ils sont heureux avec vous faire cela sur leur base de données précieuse!

  1. ouvrez SQL Server Profiler et créez une nouvelle trace se connectant à la base de données souhaitée sur laquelle vous souhaitez enregistrer la trace.
  2. sous L'onglet "Sélection D'événements "cochez" Afficher tous les événements", cochez la ligne" Performance "- > "Showplan XML" et exécutez le trace.
  3. pendant que la trace est en cours d'exécution, faites ce que vous devez faire pour que la requête en cours d'exécution lente s'exécute.
  4. attendez que la requête se termine et arrêtez la trace.
  5. pour enregistrer la trace, faites un clic droit sur le plan xml dans SQL Server Profiler et sélectionnez " Extraire les données d'événement..."pour enregistrer le plan dans un fichier au format XML.

Le plan que vous obtenez est équivalent à L'option" Inclure le Plan D'exécution réel " dans SQL Server Management Studio.

Méthode 4 - Inspection du cache de requête

Si vous ne pouvez pas exécuter votre requête directement et que vous ne pouvez pas non plus capturer une trace de profileur, vous pouvez toujours obtenir un plan estimé en inspectant le cache du plan de requête SQL.

Nous inspectons le cache du plan en interrogeant SQL Server DMVs . Ce qui suit est une requête de base qui listera tous les plans de requête mis en cache (en xml) avec leur texte SQL. Sur la plupart des bases de données vous devrez également ajouter des clauses de filtrage supplémentaires pour filtrer les résultats jusqu'à juste les plans qui vous intéressent.

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)

Exécutez cette requête et cliquez sur le plan XML pour ouvrir le plan dans une nouvelle fenêtre - faites un clic droit et sélectionnez "Enregistrer le plan d'exécution sous..."pour enregistrer le plan dans un fichier au format XML.

Notes:

Parce qu'il y a tellement de facteurs impliqués (allant du schéma de table et d'index aux données stockées et aux statistiques de table), vous devriez toujours essayer d'obtenir un plan d'exécution à partir de la base de données qui vous intéresse dans (normalement celui qui connaît un problème de performance).

Vous ne pouvez pas capturer un plan d'exécution pour les procédures stockées cryptées.

Plans d'exécution" réels "vs" estimés "

Un plan d'exécutionréel est celui où SQL Server exécute réellement la requête, alors qu'un plan D'exécutionestimé SQL Server calcule ce qu'ilferait sans exécuter la requête. Bien que logiquement équivalent, un plan d'exécution réel est beaucoup plus utile car il contient des détails supplémentaires et des statistiques sur ce qui s'est réellement passé lors de l'exécution de la requête. Ceci est essentiel lors du diagnostic de problèmes où les estimations des serveurs SQL sont désactivées (par exemple lorsque les statistiques sont obsolètes).

Comment interpréter un plan d'exécution de requête?

C'est un sujet assez digne d'un livre (gratuit) à part entière.

Voir aussi:

450
répondu Justin 2017-01-17 11:38:28

En plus de la réponse complète déjà affichée, il est parfois utile de pouvoir accéder au plan d'exécution par programme pour extraire des informations. Exemple de code pour cela est ci-dessous.

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

Exemple StartCapture Définition De

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

Exemple StopCapture Définition De

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
37
répondu Martin Smith 2011-09-09 09:43:15

En supposant que vous utilisez Microsoft SQL Server Management Studio

  • pour plan de requête estimé , vous pouvez appuyer sur Ctrl + l{[7] } ou sur le bouton Suivant.

entrez la description de l'image ici

  • pour plan de requête réel, vous pouvez appuyer sur Ctrl + M ou le bouton Suivant avant d'exécuter la requête.

entrez la description de l'image ici

  • pour Live Query Plan , (uniquement dans SSMS 2016) utilisez le bouton Suivant avant l'exécution de la requête.

entrez la description de l'image ici

15
répondu Tigerjz32 2016-09-15 12:11:59

À côté des méthodes décrites dans les réponses précédentes, vous pouvez également utiliser un visualiseur de plan d'exécution gratuit et un outil d'optimisation de requête ApexSQL Plan (que j'ai récemment rencontré).

Vous pouvez installer et intégrer ApexSQL Plan dans SQL Server Management Studio, de sorte que les plans d'exécution peuvent être visualisés directement depuis SSMS.

Affichage des plans D'exécution estimés dans ApexSQL Plan

  1. Cliquez sur le bouton nouvelle requête dans SSMS et collez le texte de la requête dans le fenêtre de texte de requête. Faites un clic droit et sélectionnez L'option" Afficher le Plan D'exécution estimé " dans le menu contextuel.

Nouveau bouton de requête dans SSMS

  1. Les diagrammes du plan d'exécution s'affichent sous l'onglet Plan d'exécution dans la section résultats. Ensuite, cliquez avec le bouton droit sur le plan d'exécution et dans le menu contextuel, sélectionnez L'option" Ouvrir dans le Plan ApexSQL".

Plan D'Exécution

  1. le plan D'exécution estimé sera ouvert dans ApexSQL Plan et il peut être analysé pour optimisation des requêtes.

Plan d'exécution estimatif

Affichage des plans D'exécution réels dans ApexSQL Plan

Pour afficher le plan D'exécution réel d'une requête, continuez à partir de la 2ème étape mentionnée précédemment, mais maintenant, une fois le plan estimé affiché, cliquez sur le bouton "réel" de la barre de ruban principale dans ApexSQL Plan.

cliquez sur le bouton" réel " de la barre de ruban principale

Une fois le bouton" réel " cliqué, le plan D'exécution réel sera affiché avec un aperçu détaillé du coût paramètres ainsi que d'autres données de plan d'exécution.

Le plan d'exécution réel

Plus d'informations sur l'affichage des plans d'exécution peut être trouvé en suivant ce lien.

12
répondu Marcin Czyz 2017-07-17 12:51:36

Mon outil préféré pour obtenir et analyser en profondeur les plans d'exécution des requêtes est Explorateur de plans SQL Sentry. Il est beaucoup plus convivial, pratique et complet pour l'analyse détaillée et la visualisation des plans D'exécution que SSMS.

Voici un exemple de capture d'écran pour avoir une idée de la fonctionnalité offerte par l'outil:

Capture D'écran de la fenêtre SQL Sentry Plan Explorer

Ce n'est qu'une des vues disponibles dans l'outil. Notez un ensemble d'onglets au bas de la fenêtre de l'application, qui vous permet d'obtenir différents types de représentation de votre plan d'exécution et des informations supplémentaires utiles.

En outre, je n'ai pas remarqué de limitations de son édition gratuite qui empêche de l'utiliser au quotidien ou vous oblige à acheter la version Pro éventuellement. Donc, si vous préférez rester avec l'édition gratuite, rien ne vous interdit de le faire.

Mise à jour: (Merci à Martin Smith ) plan Explorer est maintenant gratuit! Voir http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view pour plus de détails.

10
répondu Alexander Abakumov 2016-09-11 17:53:13

Les plans de requête peuvent être obtenus à partir d'une session D'Événements étendus via l'événement query_post_execution_showplan. Voici un exemple de session XEvent:

/*
    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

Après avoir créé la session, (dans SSMS) allez dans L'Explorateur D'objets et plongez dans Gestion | événements / Sessions étendus. Cliquez avec le bouton droit sur la session "GetExecutionPlan" et démarrez-la. Cliquez à nouveau avec le bouton droit de la souris et sélectionnez "regarder les données en direct".

Ensuite, ouvrez une nouvelle fenêtre de requête et exécutez une ou plusieurs requêtes. Voici une pour le 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

Après un moment ou deux, vous devriez voir certains résultats dans L'onglet" Getexecutionplan: Live Data". Cliquez sur l'un des événements query_post_execution_showplan dans la grille, puis cliquez sur l'onglet "Plan de requête" sous la grille. Il devrait ressembler à ceci:

entrez la description de l'image ici

EDIT : le code XEvent et la capture d'écran ont été générés à partir de SQL / SSMS 2012 w / SP2. Si vous utilisez SQL 2008 / R2, vous pourriez être capable de modifier le script pour le faire fonctionner. Mais cette version n'a pas D'interface graphique, vous devrez donc extraire le XML showplan, l'enregistrer en tant que *.fichier sqlplan et ouvrez-le dans SSMS. Que du lourd. XEvents n'existait pas dans SQL 2005 ou plus tôt. Donc, si vous n'êtes pas sur SQL 2012 ou plus tard, je suggère fortement l'une des autres réponses affichées ici.

5
répondu Dave Mason 2015-11-11 20:01:21

À partir de SQL Server 2016+, la fonctionnalité Query Store a été introduite pour surveiller les performances. Il fournit un aperçu du choix et des performances du plan de requête. Ce n'est pas un remplacement complet des événements trace ou extended, mais comme il évolue de version en version, nous pourrions obtenir un magasin de requêtes entièrement fonctionnel dans les futures versions de SQL Server. Le flux principal du magasin de requêtes

  1. Les composants existants de SQL Server interagissent avec le magasin de requêtes en utilisant le magasin de requêtes Gestionnaire.
  2. Query Store Manager détermine quel magasin doit être utilisé, puis transmet l'exécution à ce magasin (statistiques de Plan ou D'exécution ou statistiques D'attente de requête)
    • Magasin de Plan-persistance des informations du plan d'exécution
    • Magasin de statistiques D'exécution-persistance des informations sur les statistiques d'exécution
    • Magasin de statistiques D'attente de requête-informations sur les statistiques D'attente persistantes.
  3. Plan, statistiques D'exécution et Wait store utilise Query Store comme extension de SQL Serveur.

entrez la description de l'image ici

  1. Activation du magasin de requêtes : Le Magasin de requêtes fonctionne au niveau de la base de données sur le serveur.

    • Le Magasin de requêtes n'est pas actif par défaut pour les nouvelles bases de données.
    • vous ne pouvez pas activer le magasin de requêtes pour la base de données maître ou tempdb.
    • DMV disponible

      sys.database_query_store_options (Transact-SQL)

  2. Collecter des informations dans le magasin de requêtes : nous collectons toutes les informations disponibles à partir des trois magasins en utilisant Query Store DMV (vues de gestion de données).

    • Magasin De Plan De Requête: La persistance des informations du plan d'exécution et il est responsable de la capture de toutes les informations liées à la compilation des requêtes.

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

    • Magasin De Statistiques D'Exécution: La persistance de l' informations statistiques d'exécution et il est probablement le magasin le plus fréquemment mis à jour. Ces statistiques représentent des données d'exécution de requête.

      sys.query_store_runtime_stats (Transact-SQL)

    • Requête Attente Stats Magasin: Persistance et capture des informations statistiques d'attente.

      sys.query_store_wait_stats (Transact-SQL)

Remarque: Query wait stats Store est disponible uniquement dans SQL Server 2017 +

3
répondu vCillusion 2018-05-25 15:26:03

Voici une chose importante à savoir en plus de tout ce qui a été dit auparavant.

Les plans de requête sont souvent trop complexes pour être représentés par le type de colonne XML intégré qui a une limitation de 127 niveaux d'éléments imbriqués. C'est l'une des raisons pour lesquelles sys.dm_exec_query_plan peut renvoyer NULL ou même lancer une erreur dans les versions antérieures de MS SQL, il est donc généralement plus sûr d'utiliser sys.dm_exec_text_query_plan à la place. Ce dernier a également une fonctionnalité de bonus utile de sélectionner un plan pour une instruction particulière plutôt que le lot entier. Voici comment vous l'utilisez pour afficher les plans des instructions en cours d'exécution:

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

La colonne de texte dans la table résultante n'est cependant pas très pratique par rapport à une colonne XML. Pour pouvoir cliquer sur le résultat à ouvrir dans un onglet séparé en tant que diagramme, sans avoir à enregistrer son contenu dans un fichier, vous pouvez utiliser un petit truc (rappelez-vous que vous ne pouvez pas simplement utiliser CAST(... AS XML)), bien que cela ne fonctionne que pour un seul ligne:

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
0
répondu alkoln 2018-06-05 02:22:51

Comme avec SQL Server Management Studio (déjà expliqué), C'est aussi possible avec Datagrip comme expliqué ici.

  1. cliquez avec le bouton droit sur une instruction SQL et sélectionnez expliquer le plan.
  2. dans le volet sortie, cliquez sur Plan.
  3. par défaut, vous voyez la représentation arborescente de la requête. Pour voir la plan de requête, cliquez sur L'icône Afficher la visualisation ou appuyez sur Ctrl + Maj + Alt + U
0
répondu Daan 2018-08-25 11:03:56