I SQL Server kan du använda SET SHOWPLAN_TEXT
uttalande för att returnera detaljerad information om hur en T-SQL-sats exekveras.
SHOWPLAN_TEXT
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_ALL
, förutom att det returnerar mindre detaljer. Det är därför riktat mot applikationer som inte kan hantera de extra detaljerna som SHOWPLAN_ALL
ger.
Du kan ställa in SHOWPLAN_TEXT
till antingen ON
eller OFF
.
När SHOWPLAN_TEXT
är ON
, exekveras inte alla efterföljande T-SQL-satser. Istället returnerar SQL Server exekveringsinformation för satsen (utan att köra den).
Exempel
Här är ett exempel att visa.
SET SHOWPLAN_TEXT ON;
GO
SELECT * FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
GO
Observera att SET SHOWPLAN_TEXT
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):
Commands completed successfully. +------------+ | StmtText | |------------| | SELECT * FROM Cats c INNER JOIN Dogs d ON c.CatName = d.DogName; | +------------+ (1 row affected) +--------------------------------------------------------------------------------------------------------------------------------------+ | StmtText | |--------------------------------------------------------------------------------------------------------------------------------------| | |--Hash Match(Inner Join, HASH:([d].[DogName])=([Expr1003]), RESIDUAL:([Expr1003]=[Test].[dbo].[Dogs].[DogName] as [d].[DogName])) | | |--Table Scan(OBJECT:([Test].[dbo].[Dogs] AS [d])) | | |--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(nvarchar(255),[Test].[dbo].[Cats].[CatName] as [c].[CatName],0))) | | |--Clustered Index Scan(OBJECT:([Test].[dbo].[Cats].[PK__Cats__6A1C8AFAB3EF1A8F] AS [c])) | +--------------------------------------------------------------------------------------------------------------------------------------+ (4 rows affected) Commands completed successfully.
Hur man stänger av det
Du kan stänga av den genom att använda SET SHOWPLAN_TEXT OFF
.
När du har gjort detta kommer efterföljande satser att köras som vanligt.
SET SHOWPLAN_TEXT OFF;
GO
SELECT * FROM Cats c
INNER JOIN Dogs d
ON c.CatName = d.DogName;
GO
Resultat:
Commands completed successfully. +---------+-----------+---------+-----------+-----------+ | CatId | CatName | DogId | DogName | GoodDog | |---------+-----------+---------+-----------+-----------| | 2 | Fluffy | 2 | Fluffy | 0 | +---------+-----------+---------+-----------+-----------+ (1 row affected) Commands completed successfully.
Utfasad eller inte?
Enligt denna gamla MSDN-artikel, SET SHOWPLAN_TEXT
ä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.