I SQL Server kan du använda SET SHOWPLAN_ALL
uttalande för att returnera detaljerad information om hur en T-SQL-sats exekveras, såväl som uppskattningar av resurskraven för satserna.
SHOWPLAN_ALL
returnerar information som en uppsättning rader som bildar ett hierarkiskt träd som representerar de steg som tas av SQL Server-frågeprocessorn när den exekverar varje sats. Det liknar SHOWPLAN_TEXT
, förutom att SHOWPLAN_ALL
returnerar mer detaljerad information (och är avsedd att användas med applikationer som kan hantera dess produktion).
Du kan ställa in SHOWPLAN_ALL
till antingen ON
eller OFF
.
När SHOWPLAN_ALL
är ON
, exekveras inte alla efterföljande T-SQL-satser. Istället returnerar SQL Server exekveringsinformation för satsen (utan att köra den).
Det är viktigt att notera att SHOWPLAN_ALL
ger uppskattningar av resurskraven, och att faktiska resurskrav kan skilja sig åt när uttalandet faktiskt körs.
Exempel
Här är ett exempel att visa.
SET SHOWPLAN_ALL ON;
GO
SELECT * FROM Cats;
GO
Observera att SET SHOWPLAN_ALL
kan inte specificeras i en lagrad procedur, och det måste vara den enda satsen i en batch.
Så här ser resultatet ut i Azure Data Studio:
Och så här ser det ut i mssql-cli (kommandoradsgränssnitt) när du använder vertikal utdata:
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.
Det finns många kolumner, så jag använde vertikal utdata här så att det blir lättare att läsa.
Om min fråga var mer komplex skulle fler rader returneras.
Här är ett exempel på en (något) mer komplex fråga.
SELECT * FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
Resultat:
Hur man stänger av det
Du kan stänga av den genom att använda SET SHOWPLAN_ALL OFF
.
När du har gjort detta kommer efterföljande satser att köras som vanligt.
SET SHOWPLAN_ALL OFF;
GO
SELECT * FROM Cats;
GO
Resultat:
Commands completed successfully. +---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+ (3 rows affected) Commands completed successfully.
Utfasad eller inte?
Enligt denna gamla MSDN-artikel, SET SHOWPLAN_ALL
är schemalagd för utfasning i framtida showplan-versioner, och det rekommenderas att du använder SET SHOWPLAN_XML
istället.
Den MSDN-artikeln är dock för SQL Server 2008 R2, och när jag skriver detta verkar den inte ha blivit utfasad i SQL Server 2019. Faktum är att den aktuella dokumentationen inte nämner utfasning, och den ingår inte. när jag kör en lista över föråldrade objekt i SQL Server.
Hur som helst, det lönar sig förmodligen att ha detta i åtanke innan du använder det i framtida utgåvor.
Grafisk exekveringsplan
Om du använder ett grafiskt verktyg som SSMS eller Azure Data Studio kan du ha möjlighet att se den beräknade grafiska exekveringsplanen för den aktuella frågan.
- I SSMS kan du använda Ctrl + L att göra detta. Eller så kan du klicka på Visa beräknad exekveringsplan ikonen eller högerklicka i frågefönstret och välj Visa beräknad exekveringsplan .
- I Azure Data Studio kan du klicka på Förklara knappen ovanför frågefönstret.
Du kan också använda SET SHOWPLAN_XML ON
för att aktivera det och SET SHOWPLAN_XML OFF
för att inaktivera den.