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

SQL Server SHOWPLAN_ALL

Dans SQL Server, vous pouvez utiliser le SET SHOWPLAN_ALL instruction pour renvoyer des informations détaillées sur la façon dont une instruction T-SQL est exécutée, ainsi que des estimations des besoins en ressources pour les instructions.

SHOWPLAN_ALL renvoie des informations sous la forme d'un ensemble de lignes qui forment une arborescence hiérarchique représentant les étapes suivies par le processeur de requêtes SQL Server lors de l'exécution de chaque instruction. C'est similaire à SHOWPLAN_TEXT , sauf que SHOWPLAN_ALL renvoie des informations plus détaillées (et est destiné à être utilisé avec des applications capables de gérer sa sortie).

Vous pouvez définir SHOWPLAN_ALL soit ON ou OFF .

Lorsque SHOWPLAN_ALL est ON , toutes les instructions T-SQL suivantes ne sont pas exécutées. Au lieu de cela, SQL Server renvoie les informations d'exécution de l'instruction (sans l'exécuter).

Il est important de noter que SHOWPLAN_ALL fournit des estimations des besoins en ressources, et que les besoins réels en ressources peuvent différer lorsque l'instruction est en fait exécutée.

Exemple

Voici un exemple pour illustrer.

SET SHOWPLAN_ALL ON;
GO

SELECT * FROM Cats;
GO

Notez que SET SHOWPLAN_ALL ne peut pas être spécifié dans une procédure stockée et doit être la seule instruction d'un lot.

Voici à quoi ressemble le résultat dans Azure Data Studio :

Et voici à quoi cela ressemble dans mssql-cli (interface de ligne de commande) lors de l'utilisation de la sortie verticale :

Commands completed successfully.
-[ RECORD 1 ]-------------------------
StmtText           | 
SELECT * FROM Cats;
StmtId             | 1
NodeId             | 1
Parent             | 0
PhysicalOp         | NULL
LogicalOp          | NULL
Argument           | 1
DefinedValues      | NULL
EstimateRows       | 3
EstimateIO         | NULL
EstimateCPU        | NULL
AvgRowSize         | NULL
TotalSubtreeCost   | 0.0032853
OutputList         | NULL
Warnings           | NULL
Type               | SELECT
Parallel           | 0
EstimateExecutions | NULL
-[ RECORD 2 ]-------------------------
StmtText           |   |--Clustered Index Scan(OBJECT:([Test].[dbo].[Cats].[PK__Cats__6A1C8AFAB3EF1A8F]))
StmtId             | 1
NodeId             | 2
Parent             | 1
PhysicalOp         | Clustered Index Scan
LogicalOp          | Clustered Index Scan
Argument           | OBJECT:([Test].[dbo].[Cats].[PK__Cats__6A1C8AFAB3EF1A8F])
DefinedValues      | [Test].[dbo].[Cats].[CatId], [Test].[dbo].[Cats].[CatName]
EstimateRows       | 3
EstimateIO         | 0.003125
EstimateCPU        | 0.0001603
AvgRowSize         | 142
TotalSubtreeCost   | 0.0032853
OutputList         | [Test].[dbo].[Cats].[CatId], [Test].[dbo].[Cats].[CatName]
Warnings           | NULL
Type               | PLAN_ROW
Parallel           | 0
EstimateExecutions | 1
(2 rows affected)
Commands completed successfully.

Il y a beaucoup de colonnes, j'ai donc utilisé la sortie verticale ici pour faciliter la lecture.

Si ma requête était plus complexe, plus de lignes seraient renvoyées.

Voici un exemple de requête (légèrement) plus complexe.

SELECT * FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;

Résultat :

Comment l'éteindre

Vous pouvez le désactiver en utilisant SET SHOWPLAN_ALL OFF .

Une fois que vous avez fait cela, les instructions suivantes s'exécuteront normalement.

SET SHOWPLAN_ALL OFF;
GO

SELECT * FROM Cats;
GO

Résultat :

Commands completed successfully.
+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+
(3 rows affected)
Commands completed successfully.

Obsolète ou non ?

Selon cet ancien article MSDN, SET SHOWPLAN_ALL est prévu pour être obsolète dans les futures versions de showplan, et il est recommandé d'utiliser SET SHOWPLAN_XML à la place.

Cependant, cet article MSDN concerne SQL Server 2008 R2, et au moment où j'écris ceci, il ne semble pas avoir été obsolète dans SQL Server 2019. En fait, la documentation actuelle ne fait aucune mention de l'obsolescence, et elle n'est pas incluse. lorsque j'exécute une liste d'éléments obsolètes dans SQL Server.

Quoi qu'il en soit, il vaut probablement la peine de garder cela à l'esprit avant de l'utiliser dans les versions futures.

Plan d'exécution graphique

Si vous utilisez un outil graphique tel que SSMS ou Azure Data Studio, vous pouvez avoir la possibilité d'afficher le plan d'exécution de requête graphique estimé pour la requête actuelle.

  • Dans SSMS, vous pouvez utiliser Ctrl + L pour faire ça. Ou vous pouvez cliquer sur Afficher le plan d'exécution estimé ou faites un clic droit dans la fenêtre de requête et sélectionnez Afficher le plan d'exécution estimé .
  • Dans Azure Data Studio, vous pouvez cliquer sur Explain bouton au-dessus de la fenêtre de requête.

Vous pouvez également utiliser SET SHOWPLAN_XML ON pour l'activer, et SET SHOWPLAN_XML OFF pour le désactiver.