Plan cache bloat
SQL Server allokerer dynamisk minne til plan cache basert på tilgjengelige ressurser. Når dette minnet fylles opp, må eksisterende planer kastes ut for å gi plass til nye. Dermed kan nyttige planer bli raskt kastet ut og gjenbruk av planer reduseres.
Typiske årsaker:
- Ad hoc queries uten parameterisering
- Dynamisk generert SQL som gir mange varianter av samme spørring og lav plan reuse
- Lite eller ingen bruk av parametrisering
Resultatet er at plan cache fylles opp av mange små og lite gjenbrukte planer.
Hvorfor er dette et problem?
Plan cache bloat fører til:
- Hyppig eviction av planer. SQL Server må stadig rydde i cache → nyttige planer forsvinner.
- Spørringer må kompileres på nytt i stedet for å gjenbruke eksisterende planer → CPU
Problemet med DMV-statistikk
Ytelsesanalyse i SQL Server baserer seg ofte på DMV-er som:
sys.dm_exec_query_statssys.dm_exec_sql_textsys.dm_exec_query_plan
Ved plan cache bloat blir denne statistikken mindre pålitelig.
Hva skjer i praksis?
- Planer blir kastet ut før de rekker å akkumulere statistikk
- “Top queries”-lister blir upålitelige
- Høyt belastende spørringer kan forsvinne fra analysen
👉 Resultatet er at de reelle problemene ikke nødvendigvis kommer frem.
Typiske symptomer
- Alt er tregt, ingenting skiller seg ut
- Varierende ytelse uten klar årsak
- Høy CPU eller minnebruk uten tydelige toppspørringer
En av flere angrepsvinkler
En av flere angrepsvinkler ved plan cache bloat er å fokusere på query memory grants og tidsrommet grantene holdes. Vi kaller dette memory load.
Memory Load = query memory grant * execution time.
Denne typen belastning fanges ikke nødvendigvis godt opp gjennom DMV-statistikk alene, siden execution plans kan bli kastet ut før de rekker å akkumulere tilstrekkelig data.
En mulighet ved plan cache bloat er å sample requests over tid.
Praktisk tilnærming
- Sample requests over tid
- Identifisere spørringer med høy total memory load
- Analysere execution plans
- Se etter:
- feil cardinality estimates
- manglende indekser
- unødvendige sort/hash-operasjoner
Vi har pakket dette inn i sp_LynxTopQueriesGrantedMemoryLoad
Når bør du bruke denne tilnærmingen?
Ved hyppige evictions av execution planer
Oppsummert
Plan cache bloat gjør tradisjonell analyse vanskelig fordi statistikk forsvinner før den rekker å bli nyttig.
Kort sagt
- Plan cache bloat → dårlig observability
- DMV-er → mindre pålitelige
- Sampling + query grants → praktisk angrepsvinkel