Exekučné plány – kuchárka (začni tu)
Ako čítať exekučný plán SQL Servera od základov: odhadovaný vs. skutočný plán, smer čítania, šípky, percentá, okno Properties, varovania, mapa „vidím X → recept“ a postup pri pomalom dotaze.
Ako čítať exekučný plán SQL Servera od základov: odhadovaný vs. skutočný plán, smer čítania, šípky, percentá, okno Properties, varovania, mapa „vidím X → recept“ a postup pri pomalom dotaze.
Merge Join v pláne: prečo potrebuje zoradené vstupy, Sort pred spojením, one-to-many vs. many-to-many (Worktable v tempdb) a kedy je to najlepšie spojenie.
Memory Grant Info v pláne: Requested, Granted, MaxUsed a GrantWaitTime, varovanie Excessive Grant, vplyv šírky stĺpcov, memory grant feedback a čo robiť pri nadmernom alebo malom grante.
Nested Loops v pláne: outer vs. inner vstup, Number of Executions, Outer References, odhad na jedno vykonanie, prefetch, row goal a kedy je vnorený cyklus problém.
CONVERT_IMPLICIT v pláne: priorita dátových typov, varchar stĺpec a nvarchar parameter, varovanie SeekPlan / CardinalityEstimate, vplyv kolácie a ako typy zosúladiť.
Prečo optimalizátor odhadne 12 riadkov a príde 100 000: štatistiky a histogram, ascending key, lokálne premenné, korelované stĺpce, šírenie chyby v pláne a ako odhad opraviť.
Ako SQL Server počíta GROUP BY a DISTINCT: Stream Aggregate na zoradenom vstupe vs. Hash Aggregate s memory grantom, Partial Aggregate v paralelnom pláne a Sort pred agregáciou.
Ako čítať logical reads, physical reads, Scan count, Worktable a CPU vs. elapsed time zo SET STATISTICS IO, TIME a ako nimi overiť, či zmena plánu pomohla.
Skript vytvorí malú databázu PlanLab (zákazníci, produkty, 300 000 objednávok, 900 000 riadkov) so zámerne nerovnomernými dátami. Na nej bežia ukážky všetkých receptov kuchárky plánov.
Malé operátory v pláne: Compute Scalar (výrazy, odložené vyhodnotenie), Filter (neskorý filter, startup predicate), Constant Scan (VALUES, prázdny výsledok) a Concatenation (UNION ALL).
Adaptive Join v pláne: tri vstupy, Adaptive Threshold Rows, Estimated vs. Actual Join Type, podmienky (batch mode, compat level 140 / 150, edícia) a ako ho vyskúšať.
Sort, Distinct Sort, Top a Top N Sort v pláne: blokujúce triedenie, memory grant, šírka stĺpcov, Sort Warning (spill), row goal pri TOP a ako Sort ušetriť indexom.
Spracovanie po riadkoch (RBAR) cez kurzor, WHILE cyklus alebo skalárnu funkciu: ako sa prejaví v plánoch a plan cache, prečo je pomalé a ako ho prepísať na set-based príkaz alebo dávky.
Spool operátory v pláne: eager vs. lazy, rebinds a rewinds, Eager Index Spool ako signál chýbajúceho indexu, Row Count Spool pri NOT EXISTS, Window Spool a Halloween protection.
Ako vyzerajú funkcie v pláne: skalárna UDF skrytá v Compute Scalar, sériový plán, scalar UDF inlining v SQL Server 2019+, MSTVF s pevným odhadom, interleaved execution a inline TVF.
Parameter sniffing v pláne: Parameter Compiled vs. Runtime Value, nerovnomerné dáta, prečo plán „náhodne“ spomalí, RECOMPILE, OPTIMIZE FOR, PSP optimization (2022+) a OPPO (2025).
Prečo index nepomôže, keď je stĺpec vo funkcii, výpočte alebo LIKE s % na začiatku: SARGable vs. non-SARGable podmienky, OR cez rôzne stĺpce, catch-all dotazy a computed column.
Zelený návrh Missing Index v exekučnom pláne: ako vzniká, Impact, poradie stĺpcov, čo návrh nevie (iné indexy, zápisy), kde nájsť ďalšie návrhy a ako ich vyhodnotiť pred vytvorením.
Hash Match v pláne: build a probe vstup, hash tabuľka v pamäti, memory grant, blokujúca build fáza, Hash Warning (spill), Probe Residual, bitmap a hash agregácia.
Key Lookup a RID Lookup v pláne: prečo vznikajú, Output List, Number of Executions, bod zlomu medzi lookupom a skenom a ako ich odstrániť pokrývajúcim indexom (INCLUDE).
Index Seek v pláne: Seek Predicates (Prefix, Start, End) vs. residual Predicate, Number of Rows Read, prefix kľúča indexu a prečo „seek“ ešte neznamená málo práce.
Kedy je sken celej tabuľky alebo indexu v poriadku a kedy je to problém: Predicate, Number of Rows Read, Ordered, row goal pri TOP a ako sken nahradiť seekom.
Dva odbery sys.dm_os_wait_stats s pauzou medzi nimi: na čo server čaká práve teraz, nie od posledného reštartu. S podielom, priemerným čakaním a signal vs. resource.
Procedúry z plan cache podľa celkového CPU, s priemerným CPU a trvaním na jedno spustenie.
Štatistiky s najväčším počtom zmien od poslednej aktualizácie, s dátumom update a vzorkou.