En SQL Server-exekveringsplan är användbar för att undersöka prestandaproblem med dina frågor. Databasexperter får ofta problem med problem eller klagomål från användare om att frågor går långsamt. Frågeresultat som brukade ta två eller tre minuter kräver plötsligt mer än 30 minuter. Felsökning kan kräva att man undersöker områden som serverresurser (CPU, minne), statistik, diskprestanda, blockering, dödlägen och index. I den här artikeln kommer vi att fokusera på SQL Server-exekveringsplanens roll för att lösa prestandaproblem.
Vad händer när du skickar T-SQL i SQL Server?
Låt oss titta på vad som händer när du skickar en fråga med Transact-SQL, eller T-SQL, i SQL Server. För användarna spelar det naturligtvis ingen roll. Användare förväntar sig att få exakta resultat snabbt, oavsett om de söker efter databasen eller söker på webben.
Arbetsflödet på hög nivå för en SQL-fråga
- Användaren autentiserar till SQL Server i en klientapplikation och skickar en fråga.
- SQL Server analyserar frågan och kontrollerar eventuella syntaxfel.
- Parseträdet bearbetas vidare i Algebrizer, som löser alla objekt, tabeller och kolumner i frågan. Den utför också en kontroll av kolumndatatyperna. Vid eventuella problem returnerar den ett fel. Algebrizer genererar ett frågeprocessträd och en frågehash. Om exekveringsplanen redan finns använder SQL Server den cachade planen och exekverar frågan.
- Om det inte finns någon plan eller om planen är föråldrad, utför Query Optimizer en fullständig kostnadsbaserad optimering med hjälp av statistik, frågeprocessträd och begränsningar. Baserat på dessa indata förbereder den den kostnadsoptimerade SQL Server-exekveringsplanen.
- Slutligen utför SQL Server-frågemotorn frågan enligt exekveringsplanen och returnerar resultaten.
Översikt över en SQL Server-exekveringsplan
En SQL Server-exekveringsplan hjälper databasproffs att felsöka frågeprestanda och skriva effektiva frågor. När en fråga tar lång tid att köra kan SQL Server-exekveringsplanen hjälpa dig att identifiera den punkt där frågan tar mest resurser och tid.
Du kan använda något av följande för att skapa en exekveringsplan:
- SQL Server Management Studio
- Azure Data Studio
- SQL Server-profilerare
- Utökade evenemang
- Dynamiska hanteringsvyer
- Programvara för databasövervakning från tredje part
Utförandeplanerna som genereras av #1 till #5 är liknande. Programvara för databasövervakning från tredje part (nr 6) tillhandahåller ytterligare funktioner som använder färgkodning för att identifiera dyra operatörer.
SQL Server tillhandahåller beräknade och faktiska utförandeplaner, liknande vad du upplever när du behöver reparera din bil. En mekaniker inspekterar ditt fordon, sedan får du en uppskattning av arbetet utifrån dina krav, fordonets skick och den ungefärliga tid och material som mekanikern tror att reparationen kommer att ta. Naturligtvis kan den faktiska kostnaden och tiden skilja sig, som det gör med beräknade och faktiska SQL Server-exekveringsplaner.
Uppskattade genomförandeplaner
Utan att köra frågan kan du få en uppskattad (logisk) SQL Server-exekveringsplan baserad på SQL Server-statistik. Följ dessa steg i SQL Server Management Studio (SSMS):
- Markera frågan (om du vill ha exekveringsplanen för en specifik fråga).
- Klicka på knappen Visa uppskattad exekveringsplan (tangentbordsgenväg Ctrl + L), som visas nedan.
Ibland kan SQL Server inte skapa en beräknad plan; till exempel om en parameter används utan att ange dess värde i frågan, eller om en temporär tabell inte deklareras.
Faktisk genomförandeplan
När du har skickat frågan till SQL Server kan du få en verklig exekveringsplan som representerar de steg som SQL Server tog för att köra frågan. Precis som i fordonsreparationsscenariot är detta som den faktiska fakturan du får.
För att få den faktiska exekveringsplanen, följ stegen nedan i SSMS innan du kör frågan.
- Markera frågan.
- Klicka på Visa faktiska utförandeplan knapp (kortkommando Ctrl + M ), som visas ovan.
Format för körningsplan för SQL Server
Som standard genererar SSMS-procedurerna som förklaras ovan en SQL Server-exekveringsplan i grafiskt format. Men du har möjlighet att se utförandeplaner i tre olika format:
- Grafisk
- XML
- Text
Låt oss titta på vart och ett av dessa format.
1. Grafisk genomförandeplan
Den grafiska planen visar alla komponenter, inklusive dataflödet, som visas nedan.
Operatorer
Operatörer visas som ikoner. Varje operatör är utsedd att utföra en specifik uppgift. Till exempel kan frågeoptimeraren i SQL Server utföra en tabellsökning, en indexsökning och en sökning. Så här ser en klustrad indexsökoperatör ut när den hämtar data från ett index i tabellen [AdventureWorks2019].[HumanResources]:
Procentuell kostnad
Den grafiska planen visar också en procentuell kostnad – här 99 % för den klustrade indexsökningen – kopplad till operatören. Den kostnaden är relativ till de andra operatörerna som används för att köra frågan.
Dataflödespilar
Pilar kopplar samman operatorerna, deras bredd återspeglar antalet rader med data som flyttas från en operator till nästa.
Anta till exempel att din fråga bara genererar en enda rad med utdata men tar lång tid att slutföra. Om du flyttar musen till dataflödespilen i exekveringsplanen ser du att antalet rader som lästs är i miljoner. Det representerar en enorm obalans i resursutnyttjandet och avslöjar ett område i behov av optimering.
Verktygstips
Som visas nedan, när du för musen över en operatör visas verktygstips med mer statistik om dataflödet.
Fönstret Egenskaper
Fönstret Egenskaper visar detaljerad information om operatörerna och deras komponenter. Detta är en superuppsättning av verktygstipsen.
2. XML-formaterad SQL Server-exekveringsplan
XML-exekveringsplanen är i ett specifikt, strukturerat format. Även om XML-formatet är mindre visuellt intuitivt, innehåller det alla detaljer i XML och kräver inga ytterligare steg för att visa egenskaper och verktygstips. Du kan enkelt konvertera XML-format till grafiskt format och vice versa.
För att konvertera en grafisk exekveringsplan till XML-format, högerklicka på den och välj Visa Execution Plan XML , som visas nedan.
Resultatet är följande strukturerade, XML-formaterade exekveringsplan.
Följande kommandon genererar även exekveringsplanen i XML-format:
- För den beräknade planen:STÄLL PÅ SHOWPLAN_XML
- För den faktiska planen: STÄLL PÅ STATISTICS_XML
3. Textformaterad SQL Server-exekveringsplan
Du kan generera exekveringsplanen på flera sätt:
- STÄLL PÅ SHOWPLAN_TEXT
Det här kommandot genererar den uppskattade genomförandeplan, utan detaljerad information om utförande av en fråga. Det är avsett för applikationer som sqlcmd verktyget.
- STÄLL PÅ SHOWPLAN_ALL
Det här kommandot genererar den uppskattade genomförandeplan, med detaljerad information om alla operatörer och operationer i tabellformat.
- STÄLL IN STATISTIKPROFIL
Detta kommando genererar en verklig exekveringsplan, efter exekvering av en fråga, i tabellformat.
Varför skiljer sig uppskattade och faktiska SQL Server-exekveringsplaner?
Beräknade och faktiska utförandeplaner är i allmänhet lika, även om vissa omständigheter kan göra att de skiljer sig åt.
Inaktuell statistik
Den primära orsaken till skillnader mellan beräknade och faktiska genomförandeplaner är inaktuell statistik.
Frågeoptimeraren använder statistik för att bygga en kostnadseffektiv och optimerad exekveringsplan för frågor. Om din statistik inte uppdateras, eller om ditt datasampling inte är lämpligt, kommer frågeoptimeraren att utföra en fullständig optimering och bygga en exekveringsplan baserat på gammal information. Du kan också få en ineffektiv exekveringsplan som kan leda till frågeprestandaproblem.
Inaktuell statistik uppstår ibland när data ändras ofta och statistiken inte uppdateras enligt indexunderhåll.
Seriell eller parallell SQL Server-exekveringsplan
Vid kompilering bygger frågeoptimeraren en exekveringsplan och producerar en seriell eller parallell plan beroende på frågekostnad och kostnadströskeln för parallellism. Även om exekveringsplanen kan vara densamma för både seriella och parallella lägen, bestämmer SQL Server mellan dem baserat på serverresurser och aktivitet.
Ogiltiga uppskattningar
Som nämnts tidigare binder Algebrizer namnen på objekten innan SQL-frågan körs. Anta att du anger att en tabell med namnet test ska skapas vid körning och försök sedan generera en beräknad körningsplan. Eftersom den tabellen inte finns får du ett felmeddelande, som visas nedan.
Använda genomförandeplanen
Sammanfattningsvis kan du generera en SQL Server-exekveringsplan i grafiska, XML- och textformat och använda den för att hjälpa dig lösa dina databasprestandaproblem.
Frågeexekveringsplaner är primära steg för att identifiera frågearbetsflöden, operatorer och komponenter så att du kan ställa in dina frågor för eventuella förbättringar. För mer information om hur du använder exekveringsplaner, kolla in vårt inlägg: How to Read and Analyze Execution Plans.