SQL-forespørgselsudførelsesplaner genereres, når en forespørgselsoptimering bestemmer den mest effektive måde at levere de data, der anmodes om af en forespørgsel. Disse planer er en repræsentation af de databaseoperationer, en forespørgsel kører, og viser hvilke objekter forespørgslen bruger, typerne af anvendelser, og hvordan de bruges.
Det er almindeligt kendt, at dårligt ydende forespørgsler er en nøgleindikator for, at noget er galt i en database. Så at se "under motorhjelmen" på en forespørgsels udførelsesplan er en af de bedste måder at bestemme årsagen til ydeevneproblemet.
De tilgængelige oplysninger i en SQL-udførelsesplan er uvurderlige for DBA'er, der fejlfinder problemer med SQL Server-forespørgselsydeevne, fordi det giver dem mulighed for at finde hovedårsagen til problemet og justere forespørgslen efter behov.
Undersøgelse af SQL-udførelsesplaner er et af de første trin i præstationsjustering, fordi planen klart fremhæver de mest sandsynlige kilder til problemer i en forespørgsel, inklusive dyre operatører, et usædvanligt antal poster, der flyder mellem operatører og ekstra operatører.
DBA'er drager også fordel af advarsler om eksekveringsplaner, der advarer brugere om problemer såsom tempdb-udslip og manglende indekser.
Typer af SQL-udførelsesplaner
Der er to hovedtyper af SQL-udførelsesplaner:estimerede udførelsesplaner og faktiske estimeringsplaner.
Anslåede udførelsesplaner beskrives bedst som en slags vejrudsigt. Som navnet antyder, bruger estimerede udførelsesplaner omtrentlige beregninger, statistikker og andre parametre til at estimere trin, der kan følges af SQL Server Engine for at udføre den indsendte forespørgsel efter parsing af forespørgslen.
Du behøver ikke at udføre forespørgslen for at generere denne type eksekveringsplan, så den er god til komplekse forespørgsler, hvor det vil tage lang tid at generere en faktisk eksekveringsplan.
Faktiske eksekveringsplaner udfører den indsendte forespørgsel og viser derefter de trin, der skete under udførelsen. Denne type plan viser reelle beregninger og de faktiske (ikke estimerede) trin efterfulgt af SQL Server Engine.
Fordi denne type udførelsesplan faktisk kører forespørgslen, er den et godt valg til fejlfinding af problemer med forespørgselsydeevne.
Sådan genereres en SQL-udførelsesplan
Hackernoon giver en kortfattet beskrivelse af, hvordan man genererer estimerede og faktiske udførelsesplaner. Processen kan koges ned til følgende trin:
Generer en estimeret eksekveringsplan
- Gå til databasen
- Fremhæv forespørgslen
- Klik på "Forespørgsel"
- Klik på "Vis estimeret eksekveringsplan", eller brug genvejen Ctrl + L
Generer en faktisk eksekveringsplan
- Gå til databasen
- Fremhæv forespørgslen
- Klik på "Forespørgsel"
- Klik på "Inkluder faktisk eksekveringsplan", eller brug genvejen Ctrl + M
Du finder en detaljeret forklaring på, hvordan du genererer estimerede eksekveringsplaner og faktiske eksekveringsplaner i den officielle Microsoft-dokumentation.
Hvorfor estimerede og faktiske SQL-udførelsesplaner kan være forskellige
Generelt vil estimerede og faktiske udførelsesplaner være ens. Der er dog lejligheder, hvor de er forskellige. Dette er normalt og sker, fordi databasestatistikken og de faktiske data er forskellige. Disse forskelle kan introduceres gennem flere kanaler:
Parallelisme
Planomkostninger kan forårsage, at der oprettes to udførelsesplaner for en indsendt forespørgsel. SQL Server Engine vil vælge, om den parallelle plan skal bruges eller ej, så det er muligt for den ene plan at bruge den parallelle plan og den anden at bruge den serielle plan.
Uaktuel statistik
Når du indsætter data i og sletter data fra tabeller og indekser eller ændrer tabellen eller indeksskemaet, ændres statistikken. Hvis statistikken ikke opdateres regelmæssigt, vil den faktiske eksekveringsplan være forskellig fra den estimerede eksekveringsplan.
Ugyldig estimeret plan
Hvis en forespørgsel indeholder en sætning, der kræver en midlertidig tabel, der kun eksisterer, hvis forespørgslen udføres, vil generering af en estimeret eksekveringsplan skabe en fejl, fordi ingen forespørgsel er blevet udført. Den samme forespørgsel ville køre fint i den faktiske udførelsesplan, fordi forespørgslen blev udført.
SQL-udførelsesplaner er en værdifuld ressource til fejlfinding af SQL Server-ydelsesproblemer. At vide, hvordan man genererer både estimerede og faktiske SQL-udførelsesplaner, er et vigtigt værktøj for enhver DBA, der har til opgave at justere forespørgsler til optimal ydeevne.