sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server SHOWPLAN_ALL

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.


  1. PHP &mySQL:År 2038 Bug:Vad är det? Hur löser man det?

  2. Anonymisering av indirekta identifierare för att minska risken för åter-ID

  3. Att hålla en applikationsdatabas agnostisk (ADO.NET vs inkapslande DB-logik)

  4. Hur SUBDATE() fungerar i MariaDB