Voglio scoprire cosa sta causando le compilazioni SQL elevate (non le ricompilazioni) che vedo nei contatori di Performance Monitor.
Ecco la mia opinione su questo: se vedo molte compilazioni SQl, significa che le query sul nostro sistema non vengono memorizzate nella cache per i seguenti motivi:
- Molte domande ad hoc
Esecuzione di query che SQl non memorizza nella cache, ad esempio:
UPDATE table1 SET col1 = 'Stringa più lunga di 8000 caratteri .....' DOVE key_column = some int
I piani stanno scadendo e vengono rimossi dalla cache perché: la cache sta esaurendo lo spazio o i piani non vengono utilizzati abbastanza a lungo.
L'unica cosa che si avvicina alla cattura degli inserimenti di cache nel profiler è Stored Procedures-> SP: CacheInserts ma si occupa solo della cache delle stored procedure.
Quindi ho provato quanto segue per ottenere query ad hoc:
SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache.
, [cp].[usecounts]
, [cp].[objtype]
, st.[dbid]
, st.[objectid]
, st.[text]
, [qp].[query_plan]
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;
Ho pensato che le query che causavano le compilazioni dovessero essere quelle con objtype = Adhoc ma questo potrebbe anche riguardare le ricompilazioni. Ora devo eseguire il profiler, acquisire query che causano ricompilazioni e quindi eliminarle dall'elenco precedente.
Sto andando nella giusta direzione?
Esiste una singola query che posso usare per ottenere solo compilazioni SQL senza troppo lavoro?
Risorse che mi hanno aiutato a conseguire le conoscenze di cui sopra:
http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/954b4fba-3774-42e3-86e7-e5172abe0c83
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=143946
http: //technet.microsoft.com/en-nz/library/cc966425(en-us).aspx
http://www.sqlservercentral.com/Forums/Topic914951-360-1.aspx
Qualsiasi aiuto è molto apprezzato.