Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment obtenir un plan d'exécution de requête dans SQL Server ?

Il existe un certain nombre de méthodes pour obtenir un plan d'exécution, celle à utiliser dépendra de votre situation. Généralement, vous pouvez 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 de pouvoir 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 fonctionnalités intéressantes qui facilitent la capture d'un plan d'exécution, assurez-vous simplement que l'élément de menu "Inclure le plan d'exécution réel" (situé sous le menu "Requête") est coché et exécutez votre requête normalement .

Si vous essayez d'obtenir le plan d'exécution des instructions d'une procédure stockée, vous devez exécuter la procédure stockée, comme suit :

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 le volet des résultats. Si vous avez exécuté de nombreux relevés, vous pouvez voir de nombreux plans affichés dans cet onglet.

À partir de là, vous pouvez inspecter le plan d'exécution dans SQL Server Management Studio, ou cliquer avec le bouton droit sur le plan et sélectionner "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 je l'ai incluse par souci d'exhaustivité ou si vous ne disposez pas de SQL Server Management Studio.

Avant d'exécuter votre requête, exécutez une des déclarations suivantes. 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 accompagnées d'un ensemble de résultats supplémentaire contenant votre plan d'exécution dans le format souhaité - exécutez 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 plan d'exécution

Sauf si vous avez une forte préférence, ma recommandation est d'utiliser le STATISTICS XML option. 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 dans le format le plus 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. Cela équivaut à l'option "Afficher le plan d'exécution estimé..." 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. Cela équivaut à 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), vous pouvez capturer un plan à l'aide d'une trace SQL Server Profiler. 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 pouvez utilisez cette méthode sur un environnement de production, mais 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 en aura aucun impact sur les performances. Vous pouvez également rencontrer des problèmes pour filtrer et identifier le bon plan dans votre trace si votre base de données est fortement utilisée. Vous devriez évidemment vérifier auprès de votre DBA pour voir s'il est satisfait que vous fassiez cela sur sa précieuse base de données !

  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 la trace.
  3. Pendant que la trace est en cours d'exécution, faites tout ce que vous devez faire pour que la requête lente s'exécute.
  4. Attendez que la requête se termine et arrêtez la trace.
  5. Pour enregistrer la trace, cliquez avec le bouton droit sur le xml du plan 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 - Inspecter le cache des requêtes

Si vous ne pouvez pas exécuter votre requête directement et que vous ne pouvez pas non plus capturer une trace du 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 les DMV SQL Server. Voici une requête de base qui répertorie tous les plans de requête mis en cache (au format 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 uniquement sur 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.

Remarques :

Parce qu'il y a tellement de facteurs impliqués (allant du schéma de la table et de l'index jusqu'aux données stockées et aux statistiques de la table), vous devriez toujours essayez d'obtenir un plan d'exécution à partir de la base de données qui vous intéresse (généralement celle qui rencontre un problème de performances).

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

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

Un réel le plan d'exécution est celui où SQL Server exécute réellement la requête, alors qu'un plan estimé plan d'exécution SQL Server calcule ce qu'il ferait faire 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 et des statistiques supplémentaires 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 erronées (par exemple, lorsque les statistiques sont obsolètes).

  • Plan d'exécution estimé et réel révisé

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 :

  • Principes de base du plan d'exécution
  • Autorisation SHOWPLAN et lots Transact-SQL
  • SQL Server 2008 – Utilisation des hachages de requête et des hachages de plan de requête
  • Analyser le cache du plan SQL Server