Quando in passato ho dovuto esaminare i problemi con la memorizzazione nella cache del piano/l'eccessiva ricompilazione delle query, ho seguito le indicazioni fornite nel whitepaper Microsoft 'Pianifica la memorizzazione nella cache in SQL Server 2008' e suggerirei caldamente di leggerlo poiché copre la memorizzazione nella cache del piano, il riutilizzo del piano di query, le cause delle ricompilazioni, l'identificazione delle ricompilazioni e altri argomenti correlati.
Detto questo, SQL Server Profiler (dovrebbe trovarsi in Microsoft SQL Server 2008 -> Strumenti per le prestazioni se lo hai installato come parte dell'installazione degli strumenti client) espone tre eventi direttamente correlati alla compilazione di query che potrebbero esserti di aiuto:
- Cursore
- Cursore Ricompila
- Prestazioni
- XML Showplan per la compilazione di query
- Procedura archiviata
- SP:Ricompila
Stai utilizzando le stored procedure, quindi probabilmente devi solo preoccuparti di SP:Ricompila evento. Questo evento si attiverà ogni volta che una stored procedure, un trigger o una funzione definita dall'utente viene ricompilata. La colonna TextData mostrerà il testo dell'istruzione tsql che ha causato la ricompilazione dell'istruzione e la colonna EventSubClass mostrerà un codice che indica il motivo della ricompilazione.
Codici EventSubClass per SP:ricompila in SQL 2008
- 1 =Schema modificato
- 2 =Statistiche modificate
- 3 =Ricompila DNR
- 4 =Imposta opzione modificata
- 5 =Tabella temporanea modificata
- 6 =Rowset remoto modificato
- 7 =Permessi di navigazione modificati
- 8 =Ambiente di notifica query modificato
- 9 =Visualizzazione MPI modificata
- 10 =Opzioni del cursore cambiate
- 11 =Con opzione di ricompilazione
Se monitori i seguenti 5 eventi sarai in grado di vedere quali stored procedure e istruzioni vengono richiamate su SQL Server e quali attivano le ricompilazioni:
- Procedure del negozio
- SP:Inizio
- SP:StmtStarting
- SP:Ricompila
- SP:Completato
- Prestazioni
- Statistiche automatiche
Di solito configuro anche la traccia Profiler per acquisire tutte le colonne per quegli eventi. Direi di impostare una traccia con quei 5 eventi, eseguire una traccia da 30 a 60 secondi e quindi metterla in pausa e quindi dovresti avere una buona istantanea di ciò che sta causando le ricompilazioni.
Se c'è troppo rumore, puoi iniziare ad aggiungere filtri di colonna alle proprietà di traccia per filtrare gli eventi in entrata/uscita. Ad esempio, se trovi che la maggior parte delle tue ricompilazioni avvenga solo su un database, imposta un filtro di colonna sulla colonna databaseID o databaseName in modo che solo le query eseguite su quel database siano incluse nella tua traccia.
Quindi inizia a cercare i modelli in cui le query vengono ricompilate e utilizza il white paper di Microsoft come guida sul motivo per cui potrebbero attivare la ricompilazione.