Een trage query is zelden trage code. Het is meestal een verkeerd plan, een ontbrekende index, scheve statistics of een gebruiker die opeens een ander parameterprofiel aanroept. Onze ZZP SQL DBA's werken met een vast diagnose-spoor zodat de fix duurzaam is en niet morgen terugkomt.
Het plan ophalen, niet schatten
Een query trekken in SSMS met "Include Actual Execution Plan" laat zien wat de optimizer werkelijk doet. Estimated rows versus actual rows is de eerste tell: als die orders of magnitude verschillen, zijn de statistics scheef of is een lokale variabele het sniffing-probleem.
Missing index versus index die niet gebruikt wordt
SSMS suggereert vaak een missing index. Niet blind toevoegen. Eerst kijken of een bestaande index een include-kolom mist, of dat het echt nieuw is. Een index die niet gebruikt wordt staat in sys.dm_db_index_usage_stats met user_seeks = 0 en kost wel write-overhead. Index-toevoegen is een afweging, geen reflex.
Parameter sniffing en plan stability
Een stored procedure die voor user A snel is en voor user B traag, is parameter sniffing. OPTION (RECOMPILE) is de ruwe fix, OPTIMIZE FOR UNKNOWN de chirurgische. Query Store met forced plans geeft langdurige stabiliteit zonder code-aanpassing. Welke we kiezen hangt af van hoe vaak de query draait en hoeveel parameters er zijn.
Statistics en sample size
Default sample size voor UPDATE STATISTICS is meestal te laag voor grote tabellen. FULLSCAN is duur maar accuraat. Auto-update kicks in bij ongeveer 20 procent gewijzigde rijen, wat voor een 100M-rijen-tabel betekent: nooit. Trace flag 2371 of een geplande nightly UPDATE STATISTICS WITH FULLSCAN op kerntabellen lost dat structureel op.
Compatibility level en Cardinality Estimator
Sinds SQL Server 2014 is er een nieuwe Cardinality Estimator. Bij een upgrade van 2008/2012 naar 2017+ ziet u soms regressies. Trace flag 9481 of compatibility level 110 forceren is een tijdelijke fallback. Op termijn lost u dat op met Query Store en geforceerde plans op de regressie-queries.
Verwant: Ervaren SQL DBA, SQL Server health check.