Een uitvoeringsplan voor SQL Server is handig voor het onderzoeken van prestatieproblemen met uw query's. Databaseprofessionals ontvangen vaak probleemtickets of klachten van gebruikers dat zoekopdrachten traag verlopen. Zoekresultaten die vroeger twee of drie minuten duurden, hebben plotseling meer dan 30 minuten nodig. Voor het oplossen van problemen kan het nodig zijn om gebieden zoals serverbronnen (CPU, geheugen), statistieken, schijfprestaties, blokkering, deadlocks en indexen te onderzoeken. In dit artikel zullen we ons concentreren op de rol van het SQL Server-uitvoeringsplan bij het oplossen van prestatieproblemen.
Wat gebeurt er als je T-SQL indient in SQL Server?
Laten we eens kijken wat er gebeurt als u een query indient met Transact-SQL of T-SQL in SQL Server. Voor gebruikers maakt het natuurlijk geen verschil. Gebruikers verwachten snel nauwkeurige resultaten te krijgen, of ze nu de database doorzoeken of op internet zoeken.
De workflow op hoog niveau van een SQL-query
- Gebruiker authenticeert zich bij SQL Server in een clienttoepassing en dient een query in.
- SQL Server analyseert de query en controleert op syntaxisfouten.
- De ontledingsboom wordt verder verwerkt in Algebrizer, die alle objecten, tabellen en kolommen in de query oplost. Het voert ook een controle uit op de kolomgegevenstypen. In geval van problemen geeft het een foutmelding. Algebrizer genereert een queryprocesboom en een queryhash. Als het uitvoeringsplan al bestaat, gebruikt SQL Server dat plan in de cache en voert het de query uit.
- Als er geen plan bestaat of het plan verouderd is, voert de Query Optimizer een volledige op kosten gebaseerde optimalisatie uit met behulp van statistieken, de queryprocesstructuur en beperkingen. Op basis van die invoer stelt het het kostengeoptimaliseerde uitvoeringsplan voor SQL Server op.
- Ten slotte voert de SQL Server-query-engine de query uit volgens het uitvoeringsplan en retourneert de resultaten.
Overzicht van een uitvoeringsplan voor SQL Server
Een uitvoeringsplan voor SQL Server helpt databaseprofessionals bij het oplossen van problemen met de prestaties van query's en het schrijven van efficiënte query's. Als het lang duurt voordat een query wordt uitgevoerd, kan het uitvoeringsplan van SQL Server u helpen te bepalen op welk punt de query de meeste resources en tijd in beslag neemt.
U kunt een van de volgende dingen gebruiken om een uitvoeringsplan te genereren:
- SQL Server Management Studio
- Azure Data Studio
- SQL Server-profiler
- Uitgebreide evenementen
- Dynamische beheerweergaven
- Software voor databasebewaking van derden
De uitvoeringsplannen die door #1 tot en met #5 worden gegenereerd, zijn vergelijkbaar. Databasecontrolesoftware van derden (#6) biedt extra functies die kleurcodering gebruiken om dure operators te identificeren.
SQL Server biedt geschatte en daadwerkelijke uitvoeringsplannen, vergelijkbaar met wat u ervaart wanneer u uw auto moet repareren. Een monteur inspecteert uw voertuig, waarna u een schatting van de werkzaamheden ontvangt op basis van uw wensen, de staat van het voertuig en de geschatte tijd en materialen waarvan de monteur denkt dat de reparatie zal duren. Natuurlijk kunnen de werkelijke kosten en tijd verschillen, net als bij geschatte en werkelijke uitvoeringsplannen voor SQL Server.
Geschatte uitvoeringsplannen
Zonder de query uit te voeren, kunt u een geschat (logisch) SQL Server-uitvoeringsplan verkrijgen op basis van SQL Server-statistieken. Volg deze stappen in SQL Server Management Studio (SSMS):
- Markeer de zoekopdracht (voor het geval je het uitvoeringsplan voor een specifieke zoekopdracht wilt).
- Klik op de knop Geschat uitvoeringsplan weergeven (sneltoets Ctrl + L), zoals hieronder weergegeven.
Soms is SQL Server niet in staat om een geschat plan te maken; bijvoorbeeld als een parameter wordt gebruikt zonder de waarde ervan in de query op te geven, of als er geen tijdelijke tabel is gedeclareerd.
Eigenlijk uitvoeringsplan
Nadat u de query naar SQL Server hebt verzonden, kunt u een daadwerkelijk uitvoeringsplan verkrijgen dat de stappen weergeeft die SQL Server heeft genomen om de query uit te voeren. Net als in het scenario voor autoreparatie, is dit hetzelfde als de daadwerkelijke rekening die u ontvangt.
Om het daadwerkelijke uitvoeringsplan te krijgen, volgt u de onderstaande stappen in SSMS voordat u de query uitvoert.
- Markeer de zoekopdracht.
- Klik op de Weergave van het werkelijke uitvoeringsplan knop (sneltoets Ctrl + M ), zoals hierboven weergegeven.
SQL Server uitvoeringsplan formaten
Standaard genereren de hierboven beschreven SSMS-procedures een SQL Server-uitvoeringsplan in grafisch formaat. Maar u heeft de mogelijkheid om uitvoeringsplannen in drie verschillende formaten te bekijken:
- Grafisch
- XML
- Tekst
Laten we elk van die formaten eens bekijken.
1. Grafisch uitvoeringsplan
Het grafische plan toont alle componenten, inclusief de gegevensstroom, zoals hieronder weergegeven.
Operators
Operators worden weergegeven als pictogrammen. Elke operator is aangewezen om een specifieke taak uit te voeren. De query-optimizer in SQL Server kan bijvoorbeeld een tabelscan, een indexscan en een zoekopdracht uitvoeren. Dit is hoe een zoekoperator voor geclusterde indexen eruitziet als deze gegevens ophaalt uit een index in de [AdventureWorks2019].[HumanResources]-tabel:
Percentage kosten
Het grafische plan toont ook een percentage van de kosten - hier 99% voor de geclusterde indexzoekopdracht - die zijn gekoppeld aan de operator. Die kosten zijn relatief ten opzichte van de andere operators die worden gebruikt bij het uitvoeren van de query.
Pijlen voor gegevensstroom
Pijlen verbinden de operators, hun breedte weerspiegelt het aantal rijen gegevens dat van de ene operator naar de andere gaat.
Stel bijvoorbeeld dat uw query slechts één rij uitvoer genereert, maar dat het lang duurt voordat deze is voltooid. Als u de muis naar de gegevensstroompijl in het uitvoeringsplan beweegt, ziet u dat het aantal gelezen rijen in de miljoenen loopt. Dat vertegenwoordigt een enorme onbalans in het gebruik van hulpbronnen en onthult een gebied dat moet worden geoptimaliseerd.
Kooltips
Zoals hieronder wordt weergegeven, verschijnen er tooltips met meer statistieken over de gegevensstroom wanneer u met de muis over een operator gaat.
Eigenschappenvenster
Het venster Eigenschappen geeft gedetailleerde informatie weer over de operators en hun componenten. Dit is een superset van de tooltips.
2. SQL Server-uitvoeringsplan in XML-indeling
Het XML-uitvoeringsplan heeft een specifiek, gestructureerd formaat. Hoewel het XML-formaat visueel minder intuïtief is, bevat het alle details in XML en zijn er geen extra stappen nodig om eigenschappen en knopinfo te bekijken. U kunt XML-indeling eenvoudig converteren naar grafisch formaat en vice versa.
Als u een grafisch uitvoeringsplan naar XML-indeling wilt converteren, klikt u er met de rechtermuisknop op en kiest u Toon Execution Plan XML , zoals hieronder weergegeven.
Het resultaat is het volgende gestructureerde, XML-geformatteerde uitvoeringsplan.
De volgende commando's genereren ook het uitvoeringsplan in XML-formaat:
- Voor het geschatte abonnement:STEL SHOWPLAN_XML IN
- Voor het daadwerkelijke abonnement: STEL STATISTICS_XML IN
3. Tekstgeformatteerd uitvoeringsplan voor SQL Server
U kunt het uitvoeringsplan op verschillende manieren genereren:
- STEL SHOWPLAN_TEXT IN
Deze opdracht genereert de geschatte uitvoeringsplan, zonder gedetailleerde informatie over het uitvoeren van query's. Het is bedoeld voor toepassingen zoals het hulpprogramma sqlcmd.
- STEL SHOWPLAN_ALL IN
Deze opdracht genereert de geschatte uitvoeringsplan, met gedetailleerde informatie over alle operators en bewerkingen in tabelvorm.
- STEL STATISTIEKENPROFIEL IN
Deze opdracht genereert een daadwerkelijk uitvoeringsplan, na uitvoering van de query, in tabelvorm.
Waarom zijn de geschatte en werkelijke uitvoeringsplannen voor SQL Server verschillend?
Geschatte en daadwerkelijke uitvoeringsplannen zijn over het algemeen vergelijkbaar, hoewel sommige omstandigheden ervoor kunnen zorgen dat ze verschillen.
Verouderde statistieken
De belangrijkste reden voor verschillen tussen geschatte en werkelijke uitvoeringsplannen zijn verouderde statistieken.
De query-optimizer gebruikt statistieken om een kosteneffectief en geoptimaliseerd plan voor het uitvoeren van query's op te stellen. Als uw statistieken niet zijn bijgewerkt of als uw gegevenssteekproeven niet geschikt zijn, voert queryoptimalisatie een volledige optimalisatie uit en stelt een uitvoeringsplan op op basis van oude informatie. U kunt ook een inefficiënt uitvoeringsplan krijgen dat kan leiden tot prestatieproblemen bij query's.
Verouderde statistieken treden soms op wanneer gegevens vaak veranderen en statistieken niet worden bijgewerkt volgens het onderhoud van de index.
Seriële of parallelle uitvoeringsplan voor SQL Server
Tijdens het compileren bouwt de query-optimizer een uitvoeringsplan en produceert een serieel of parallel plan, afhankelijk van de querykosten en de kostendrempel van parallellisme. Hoewel het uitvoeringsplan hetzelfde kan zijn voor zowel de seriële als de parallelle modus, beslist SQL Server tussen beide op basis van serverbronnen en activiteit.
Ongeldige schattingen
Zoals eerder vermeld, bindt Algebrizer de namen van de objecten voordat de SQL-query wordt uitgevoerd. Stel dat u opgeeft dat een tabel met de naam test tijdens runtime wordt gemaakt en probeert vervolgens een geschat uitvoeringsplan te genereren. Omdat die tabel niet bestaat, ontvang je een foutmelding, zoals hieronder weergegeven.
Het uitvoeringsplan gebruiken
Samenvattend kunt u een SQL Server-uitvoeringsplan genereren in grafische, XML- en tekstindelingen en dit gebruiken om uw databaseprestatieproblemen op te lossen.
Plannen voor het uitvoeren van query's zijn primaire stappen bij het identificeren van de query-workflow, operators en componenten, zodat u uw query's kunt afstemmen op mogelijke verbeteringen. Bekijk onze post voor meer informatie over het gebruik van uitvoeringsplannen:Uitvoeringsplannen lezen en analyseren.