Toen ik in het verleden problemen moest onderzoeken met plancaching/overmatige hercompilatie van query's, heb ik de richtlijnen gevolgd in de Microsoft-whitepaper 'Caching plannen in SQL Server 2008' en ik zou het ten zeerste aanbevelen om dat te lezen, aangezien het plancaching, het hergebruik van queryplannen, de oorzaken van hercompilaties, het identificeren van hercompilaties en andere gerelateerde onderwerpen behandelt.
Dat gezegd hebbende, stelt SQL Server Profiler (moet zich onder Microsoft SQL Server 2008 -> Performance Tools bevinden als u het als onderdeel van de installatie van uw clienthulpprogramma's hebt geïnstalleerd) drie gebeurtenissen bloot die rechtstreeks verband houden met het compileren van query's en die u kunnen helpen:
- Cursor
- CursorHercompileren
- Prestaties
- Showplan XML voor querycompilatie
- Opgeslagen procedure
- SP:Hercompileren
U gebruikt Stored Procedures, dus waarschijnlijk hoeft u zich alleen maar zorgen te maken over de SP:Hercompileren evenement. Deze gebeurtenis wordt geactiveerd wanneer een opgeslagen procedure, trigger of door de gebruiker gedefinieerde functie opnieuw is gecompileerd. De kolom TextData toont de tekst van de tsql-instructie die de hercompilatie van de instructie heeft veroorzaakt en de kolom EventSubClass toont een code die de reden voor de hercompilatie aangeeft.
EventSubClass-codes voor SP:Hercompileren in SQL 2008
- 1 =Schema gewijzigd
- 2 =Statistieken gewijzigd
- 3 =DNR opnieuw compileren
- 4 =Stel optie gewijzigd in
- 5 =Tijdelijke tabel gewijzigd
- 6 =Externe rijenset gewijzigd
- 7 =Voor gewijzigde toestemmingen voor bladeren
- 8 =Omgeving voor querymelding gewijzigd
- 9 =MPI-weergave gewijzigd
- 10 =Cursoropties gewijzigd
- 11 =Met optie voor hercompileren
Als u de volgende 5 gebeurtenissen in de gaten houdt, kunt u zien welke opgeslagen procedures en instructies worden aangeroepen op de SQL Server en welke hercompilaties veroorzaken:
- Bewaarprocedures
- SP:Beginnend
- SP:StmtBegint
- SP:Hercompileren
- SP:Voltooid
- Prestaties
- Auto-statistieken
Ik stel meestal ook de Profiler-trace in om alle kolommen voor die gebeurtenissen vast te leggen. Ik zou zeggen stel een trace in met die 5 gebeurtenissen, voer een trace uit gedurende 30 tot 60 seconden en pauzeer het dan en dan zou je een goede momentopname moeten hebben van wat de hercompilaties veroorzaakt.
Als er te veel ruis is, kunt u beginnen met het toevoegen van kolomfilters aan de traceereigenschappen om gebeurtenissen in/uit te filteren. Als u bijvoorbeeld merkt dat de meeste van uw hercompilaties in slechts één database plaatsvinden, stelt u een kolomfilter in op de databaseID of databaseName-kolom, zodat alleen query's die op die database worden uitgevoerd, worden opgenomen in uw tracering.
Ga dan op zoek naar patronen waarin query's opnieuw worden gecompileerd en gebruik de whitepaper van Microsoft als een gids voor waarom ze de hercompilatie zouden kunnen activeren.