sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan får jeg en forespørgselsudførelsesplan i SQL Server?

Der er en række metoder til at opnå en udførelsesplan, hvilken man skal bruge, afhænger af dine forhold. Normalt kan du bruge SQL Server Management Studio til at få en plan, men hvis du af en eller anden grund ikke kan køre din forespørgsel i SQL Server Management Studio, kan du måske finde det nyttigt at få en plan via SQL Server Profiler eller ved at inspicere planens cache.

Metode 1 - Brug af SQL Server Management Studio

SQL Server kommer med et par smarte funktioner, der gør det meget nemt at fange en eksekveringsplan, sørg blot for, at menupunktet "Inkluder faktisk eksekveringsplan" (findes under menuen "Forespørgsel") er afkrydset, og kør din forespørgsel som normalt .

Hvis du forsøger at få eksekveringsplanen for udsagn i en lagret procedure, skal du udføre den lagrede procedure, som sådan:

exec p_Example 42

Når din forespørgsel er fuldført, skulle du kunne se en ekstra fane med titlen "Udførelsesplan" i resultatruden. Hvis du kørte mange erklæringer, kan du muligvis se mange planer vist på denne fane.

Herfra kan du inspicere eksekveringsplanen i SQL Server Management Studio, eller højreklikke på planen og vælge "Gem eksekveringsplan som ..." for at gemme planen til en fil i XML-format.

Metode 2 - Brug af SHOWPLAN-indstillinger

Denne metode minder meget om metode 1 (faktisk er det, hvad SQL Server Management Studio gør internt), men jeg har inkluderet det for fuldstændighedens skyld, eller hvis du ikke har SQL Server Management Studio tilgængeligt.

Før du kører din forespørgsel, skal du køre én af følgende udsagn. Sætningen skal være den eneste sætning i batchen, dvs. du kan ikke udføre en anden sætning på samme tid:

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

Disse er tilslutningsmuligheder, og du behøver derfor kun at køre dette én gang pr. forbindelse. Fra dette tidspunkt vil alle kørende sætninger blive ledsaget af et yderligere resultatsæt indeholdende din udførelsesplan i det ønskede format - kør blot din forespørgsel, som du plejer for at se planen.

Når du er færdig, kan du slå denne indstilling fra med følgende erklæring:

SET <<option>> OFF

Sammenligning af udførelsesplanformater

Medmindre du har en stærk præference, er min anbefaling at bruge STATISTICS XML mulighed. Denne mulighed svarer til indstillingen "Inkluder faktisk eksekveringsplan" i SQL Server Management Studio og leverer flest oplysninger i det mest bekvemme format.

  • SHOWPLAN_TEXT - Viser en grundlæggende tekstbaseret estimeret udførelsesplan uden at udføre forespørgslen
  • SHOWPLAN_ALL - Viser en tekstbaseret estimeret udførelsesplan med omkostningsestimater uden at udføre forespørgslen
  • SHOWPLAN_XML - Viser en XML-baseret estimeret udførelsesplan med omkostningsestimater uden at udføre forespørgslen. Dette svarer til indstillingen "Vis estimeret udførelsesplan..." i SQL Server Management Studio.
  • STATISTICS PROFILE - Udfører forespørgslen og viser en tekstbaseret faktisk udførelsesplan.
  • STATISTICS XML - Udfører forespørgslen og viser en XML-baseret faktisk eksekveringsplan. Dette svarer til indstillingen "Inkluder faktisk eksekveringsplan" i SQL Server Management Studio.

Metode 3 - Brug af SQL Server Profiler

Hvis du ikke kan køre din forespørgsel direkte (eller din forespørgsel kører ikke langsomt, når du udfører den direkte - husk, at vi ønsker en plan for forespørgslen, der yder dårligt), så kan du fange en plan ved hjælp af en SQL Server Profiler-sporing. Ideen er at køre din forespørgsel, mens et spor, der fanger en af ​​"Showplan"-begivenhederne, kører.

Bemærk, at du kan afhængig af belastning Brug denne metode i et produktionsmiljø, men du skal naturligvis være forsigtig. SQL Server-profileringsmekanismerne er designet til at minimere indvirkningen på databasen, men det betyder ikke, at der ikke vil være nogen præstationspåvirkning. Du kan også have problemer med at filtrere og identificere den korrekte plan i dit spor, hvis din database er under stor brug. Du bør selvfølgelig tjekke med din DBA for at se, om de er tilfredse med, at du gør dette på deres dyrebare database!

  1. Åbn SQL Server Profiler, og opret en ny sporing, der forbinder til den ønskede database, som du ønsker at optage sporingen mod.
  2. Under fanen "Valg af begivenheder" skal du markere "Vis alle begivenheder", markere rækken "Performance" -> "Vis plan XML" og køre sporingen.
  3. Mens sporingen kører, skal du gøre, hvad det er, du skal gøre for at få den langsomt kørende forespørgsel til at køre.
  4. Vent på, at forespørgslen er fuldført, og stop sporingen.
  5. For at gemme sporingen skal du højreklikke på planens xml i SQL Server Profiler og vælge "Udtræk hændelsesdata..." for at gemme planen til fil i XML-format.

Den plan, du får, svarer til muligheden "Inkluder faktisk eksekveringsplan" i SQL Server Management Studio.

Metode 4 - Inspicering af forespørgselscachen

Hvis du ikke kan køre din forespørgsel direkte, og du heller ikke kan fange et profileringsspor, kan du stadig få en estimeret plan ved at inspicere SQL-forespørgselsplanens cache.

Vi inspicerer planens cache ved at forespørge SQL Server DMV'er. Det følgende er en grundlæggende forespørgsel, som viser alle cachelagrede forespørgselsplaner (som xml) sammen med deres SQL-tekst. På de fleste databaser skal du også tilføje yderligere filtreringsklausuler for at filtrere resultaterne ned til netop de planer, du er interesseret i.

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)

Udfør denne forespørgsel og klik på planens XML for at åbne planen i et nyt vindue - højreklik og vælg "Gem udførelsesplan som..." for at gemme planen til fil i XML-format.

Bemærkninger:

Fordi der er så mange faktorer involveret (lige fra tabel- og indeksskemaet ned til de lagrede data og tabelstatistikken), bør du altid prøv at få en eksekveringsplan fra den database, du er interesseret i (normalt den, der oplever et ydeevneproblem).

Du kan ikke fange en eksekveringsplan for krypterede lagrede procedurer.

"faktiske" kontra "estimerede" udførelsesplaner

En faktisk eksekveringsplan er en, hvor SQL Server faktisk kører forespørgslen, mens en estimeret eksekveringsplan SQL Server regner ud, hvad den ville gøre uden at udføre forespørgslen. Selvom logisk ækvivalent, er en faktisk eksekveringsplan meget mere nyttig, da den indeholder yderligere detaljer og statistik om, hvad der faktisk skete, da forespørgslen blev eksekveret. Dette er vigtigt ved diagnosticering af problemer, hvor SQL Server-estimationer er slået fra (såsom når statistikker er forældede).

  • Estimeret og faktisk udførelsesplan genbesøgt

Hvordan fortolker jeg en plan for udførelse af forespørgsler?

Dette er et emne, der er værdigt nok til en (gratis) bog i sig selv.

Se også:

  • Grundlæggende om gennemførelsesplan
  • SHOWPLAN-tilladelse og Transact-SQL-batches
  • SQL Server 2008 – Brug af forespørgsels-hashes og forespørgselsplan-hashes
  • Analyse af SQL Server Plan Cache


  1. Hvordan søger man JSON-data i MySQL?

  2. Sådan installeres og sikres MariaDB på CentOS 8

  3. Henter linket liste i MySQL-database

  4. Unik nøgle i Oracle med eksempler