Gå direkte til indhold

SQL Server - Exekveringsplan

lästid I minuter: 1

Hjälp! Min fråga är långsam. Nästa gång du exekverar frågan kommer det att finnas ytterligare en flik i resultatdelen. Var börjar man?

Oftast är ett bra ställe exekveringsplanen för frågan. Enklaste sättet att se den är i Management Studio.

Enklaste sättet att se exekveringsplanen är i Management Studio. Ta fram den aktuella frågan i ett fönster och tryck ctrl+M.

Nästa gång du exekverar frågan kommer det att finnas ytterligare en flik i resultat delen:

exevkeringsplan-2

Så var börjar man? Naturligtvis kan man gräva ner sig hur långt som helst men jag kommer att hålla mig på en väldigt förenklad nivå.

För att förstå hur frågan exekveras börjar man läsa den från vänster till höger, uppifrån och ner. Varje ikon i exekveringsplanen är en operation som motsvarar en av nästan 100 olika händelser eller beslut som sker när frågan behandlas. Dataflödet motsvaras av pilarna mellan ikonerna och tjockleken på dem motsvarar datamängden och går i sin tur från höger till vänster. Därför ska man sträva efter att flytta predikat så långt till höger som möjligt för att hålla nere datamängderna som ska hanteras.

För att optimera exekveringsplanen finns det ett par ikoner att hålla ögat på lite extra:

exevkeringsplan-4 Lookup

Predikat som uppfyllas av ett ickeklustrat index men saknar värde på en eller flera kolumner och måste därför gå tillbaka och hämt de värdena från hashtabellen eller det klustrade indexet.

exevkeringsplan-5 Spool

Fungerar som en form av Cache i exekveringsplanen. Det uppkommer när rätt index saknas eller har dålig unikhet. Skapas som dolda tabeller i tempdb.

exevkeringsplan-6 Sort

ORDER BY, merge joins, stream aggregates, windowing. Skalar dåligt, blir mycket sämre när datamängden ökar. Kontrollera index och om sorteringen verkligen behövs eller kan flyttas till exempel till applikationssidan.

exevkeringsplan-7 Hash

Aggregering och joins. Skalar linjärt men kan/kommer att spilla till tempdb. Kolla index.

exevkeringsplan-8 Serial Nested Loops

Joins. Ofta boven när en fråga går bra ena gången men inte dagen efter. Funkar bäst med lite data i yttre loopen. Kontrollera statistik hur ordningen är gjord i joinen.

Bonus

exevkeringsplan-10 exevkeringsplan-9 Scans

Kan vara dåligt, beror på hur många rader som hanteras/returneras. Håll utsikt efter implicita datatypskonvertingar i predikat. Kan i vissa fall orsaka indexskanning som ger dålig prestanda.

Ytterligare en bonus som Management studio ger dig om du undersöker en exekveringsplan är att den varnar för missade index och berättar vad den saknar. Detta hittar du direkt efter varje del av frågan i grön text:

exevkeringsplan-11

Som sagt finns det naturligtvis mycket annat att kontrollera men man bruka komma ganska långt med ovan.

Hör gärna av er med frågor eller kommentarer.

/Björn

Ska vi träffas och prata om vad vi konkret kan göra för dig?