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:
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:
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.
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.
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.
Hash
Aggregering och joins. Skalar linjärt men kan/kommer att spilla till tempdb. Kolla index.
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
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:
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