sql >> Databasteknik >  >> RDS >> Sqlserver

Hur får jag en frågeexekveringsplan i SQL Server?

Det finns ett antal metoder för att få en utförandeplan, vilken du ska använda beror på dina omständigheter. Vanligtvis kan du använda SQL Server Management Studio för att få en plan, men om du av någon anledning inte kan köra din fråga i SQL Server Management Studio kan det vara bra att få en plan via SQL Server Profiler eller genom att inspektera planens cache.

Metod 1 - Använda SQL Server Management Studio

SQL Server kommer med ett par snygga funktioner som gör det mycket enkelt att fånga en exekveringsplan, se bara till att menyalternativet "Inkludera faktisk exekveringsplan" (finns under menyn "Fråga") är markerat och kör din fråga som vanligt .

Om du försöker få exekveringsplanen för uttalanden i en lagrad procedur bör du utföra den lagrade proceduren, så här:

exec p_Example 42

När din fråga är klar bör du se en extra flik med titeln "Exekutionsplan" visas i resultatrutan. Om du körde många uttalanden kan du se många planer visas på den här fliken.

Härifrån kan du inspektera exekveringsplanen i SQL Server Management Studio, eller högerklicka på planen och välj "Save Execution Plan As ..." för att spara planen till en fil i XML-format.

Metod 2 - Använda SHOWPLAN-alternativ

Denna metod är väldigt lik metod 1 (det är faktiskt vad SQL Server Management Studio gör internt), men jag har inkluderat det för fullständighetens skull eller om du inte har SQL Server Management Studio tillgänglig.

Innan du kör din fråga, kör ett av följande uttalanden. Satsen måste vara den enda satsen i partiet, det vill säga du kan inte köra en annan sats samtidigt:

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

Dessa är anslutningsalternativ och du behöver bara köra detta en gång per anslutning. Från och med denna tidpunkt kommer alla körningar att åtföljas av en ytterligare resultatuppsättning som innehåller din genomförandeplan i önskat format - kör helt enkelt din fråga som du normalt skulle göra för att se planen.

När du är klar kan du stänga av det här alternativet med följande uttalande:

SET <<option>> OFF

Jämförelse av utförandeplansformat

Om du inte har en stark preferens är min rekommendation att använda STATISTICS XML alternativ. Det här alternativet motsvarar alternativet "Inkludera faktisk exekveringsplan" i SQL Server Management Studio och ger mest information i det mest bekväma formatet.

  • SHOWPLAN_TEXT - Visar en grundläggande textbaserad beräknad exekveringsplan, utan att exekvera frågan
  • SHOWPLAN_ALL - Visar en textbaserad beräknad utförandeplan med kostnadsuppskattningar, utan att köra frågan
  • SHOWPLAN_XML - Visar en XML-baserad beräknad utförandeplan med kostnadsuppskattningar, utan att exekvera frågan. Detta motsvarar alternativet "Visa uppskattad exekveringsplan..." i SQL Server Management Studio.
  • STATISTICS PROFILE - Utför frågan och visar en textbaserad faktisk utförandeplan.
  • STATISTICS XML - Utför frågan och visar en XML-baserad faktisk utförandeplan. Detta motsvarar alternativet "Inkludera faktisk exekveringsplan" i SQL Server Management Studio.

Metod 3 - Använda SQL Server Profiler

Om du inte kan köra din fråga direkt (eller din fråga inte körs långsamt när du kör den direkt - kom ihåg att vi vill ha en plan för frågan som fungerar dåligt), då kan du fånga en plan med en SQL Server Profiler-spårning. Tanken är att köra din fråga medan ett spår som fångar en av "Showplan"-händelserna körs.

Observera att du kan beroende på belastning använd den här metoden i en produktionsmiljö, men du bör självklart vara försiktig. SQL Server-profileringsmekanismerna är utformade för att minimera påverkan på databasen men det betyder inte att det inte kommer att finnas någon prestationspåverkan. Du kan också ha problem med att filtrera och identifiera rätt plan i ditt spår om din databas är under mycket användning. Du bör självklart kolla med din DBA för att se om de är nöjda med att du gör detta på deras värdefulla databas!

  1. Öppna SQL Server Profiler och skapa ett nytt spår som ansluter till den önskade databasen som du vill spela in spåret mot.
  2. Under fliken "Händelseval" markerar du "Visa alla händelser", kontrollerar raden "Prestanda" -> "Visaplan XML" och kör spåret.
  3. Medan spårningen körs, gör vad du än behöver göra för att få den långsamma körningen att köras.
  4. Vänta på att frågan har slutförts och stoppa spårningen.
  5. För att spara spårningen, högerklicka på planens xml i SQL Server Profiler och välj "Extrahera händelsedata..." för att spara planen i filen i XML-format.

Planen du får motsvarar alternativet "Inkludera faktisk exekveringsplan" i SQL Server Management Studio.

Metod 4 - Inspektera frågecachen

Om du inte kan köra din fråga direkt och du inte heller kan fånga en profileringsspårning kan du fortfarande få en uppskattad plan genom att inspektera SQL-frågeplanens cache.

Vi inspekterar planens cache genom att fråga SQL Server DMVs. Följande är en grundläggande fråga som listar alla cachade frågeplaner (som xml) tillsammans med deras SQL-text. På de flesta databaser måste du också lägga till ytterligare filtreringsklausuler för att filtrera ner resultaten till bara de planer du är intresserad av.

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)

Kör den här frågan och klicka på planens XML för att öppna planen i ett nytt fönster - högerklicka och välj "Spara exekveringsplan som..." för att spara planen till fil i XML-format.

Anmärkningar:

Eftersom det är så många faktorer inblandade (från tabell- och indexschemat ner till lagrad data och tabellstatistik) bör du alltid försök att få en exekveringsplan från databasen du är intresserad av (normalt den som har ett prestandaproblem).

Du kan inte fånga en exekveringsplan för krypterade lagrade procedurer.

"faktiska" kontra "uppskattade" utförandeplaner

En faktisk exekveringsplan är en där SQL Server faktiskt kör frågan, medan en uppskattad exekveringsplan SQL Server räknar ut vad den skulle göra utan att köra frågan. Även om det är logiskt likvärdigt, är en verklig exekveringsplan mycket mer användbar eftersom den innehåller ytterligare detaljer och statistik om vad som faktiskt hände när frågan kördes. Detta är viktigt vid diagnostisering av problem där SQL Servers uppskattningar är avstängda (som när statistik är inaktuell).

  • Uppskattad och faktisk utförandeplan har granskats på nytt

Hur tolkar jag en utförandeplan för en fråga?

Detta är ett ämne som är värdigt nog för en (gratis) bok i sig.

Se även:

  • Grundläggande information om genomförandeplan
  • SHOWPLAN Permission och Transact-SQL-batcher
  • SQL Server 2008 – Använda Query-hashar och Query Plan-hashar
  • Analysera SQL Server Plan Cache


  1. När är det dags att uppgradera till SQL?

  2. Oracle SQL Developer 21.4.2 och SQLcl 21.4.1 är nu tillgängliga

  3. Hur ersätter man specifika värden i en Oracle-databaskolumn?

  4. 4 sätt att hitta rader som innehåller versaler i PostgreSQL