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.
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.
Keď dotaz zrazu spomalí kvôli novému plánu: Query Store a jeho plány v čase, Regressed Queries, vynútenie plánu (sp_query_store_force_plan), automatic plan correction a Query Store hints (2022+).
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.
Spill do tempdb v pláne: varovanie SpillToTempDb pri Sort a Hash Match, spill level, prečo vzniká (podhodnotený odhad a memory grant) a čo pomôže vrátane memory grant feedback (2017 / 2019 / 2022).
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ť.
Plány zmien dát: Clustered Index Insert / Update / Delete, narrow vs. wide plán, Split / Sort / Collapse, Assert pre CHECK a cudzie kľúče, Halloween protection a triggery.
Columnstore Index Scan a batch mode v pláne: Actual Execution Mode, Segments Read / Skipped, predicate a aggregate pushdown, delta store a batch mode on rowstore (2019+).
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.
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.
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.
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.
Prečo table variable odhaduje 1 riadok, čo zmenila table variable deferred compilation v SQL Server 2019 (compat 150), kedy použiť #temp tabuľku a OPTION (RECOMPILE).
Čakania priamo v exekučnom pláne: WaitStats a QueryTimeStats (CPU vs. elapsed) na SELECT, ktoré čakania ukazujú na plán (PAGEIOLATCH, RESOURCE_SEMAPHORE, CXPACKET) a ktoré nie.
Katalóg varovaní v exekučnom pláne: No Join Predicate, Columns With No Statistics, implicitná konverzia, Unmatched Indexes, spill, Excessive Grant a ďalšie – kde ich nájsť a čo s nimi.
Všetky cesty k plánu: odhadovaný (Ctrl+L, SHOWPLAN_XML, plan cache), skutočný (Ctrl+M, STATISTICS XML), posledný skutočný z cache (2019+), plán bežiaceho dotazu a plány z Query Store.
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.
Kedy SQL Server zvolí paralelný plán: cost threshold for parallelism, MAXDOP (server, databáza, hint), NonParallelPlanReason, čakania CXPACKET a CXCONSUMER a DOP feedback v SQL Server 2022.
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.
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.
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.
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.
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).
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ť.