Quero descobrir o que está causando as altas compilações SQL (não as recompilações) que estou vendo nos contadores do monitor de desempenho.
Aqui está minha opinião: se estou vendo muitas compilações SQl, significa que as consultas em nosso sistema não estão sendo armazenadas em cache pelos seguintes motivos:
- Muitas consultas ad-hoc
Executando consultas que o SQl não armazena em cache, por exemplo:
UPDATE table1 SET col1 = 'String com mais de 8000 caracteres .....' WHERE key_column = some int
Os planos expiram e estão sendo removidos do cache porque: O cache está ficando sem espaço ou os planos não estão sendo usados por tempo suficiente.
A única coisa que se aproxima da captura de inserções de cache no criador de perfil é Procedimentos armazenados-> SP: CacheInserts, mas ele apenas cuida do cache do procedimento armazenado.
Então, tentei o seguinte para obter consultas 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 ;
Eu pensei que as consultas que causaram as compilações deveriam ser aquelas com objtype = Adhoc, mas isso também pode estar relacionado a recompilações. Agora eu tenho que executar o criador de perfil, capturar consultas causando recompilações e, em seguida, extraí-lo da lista acima.
Estou indo na direção certa?
Existe uma única consulta que posso usar para obter apenas compilações SQL sem muito trabalho?
Recursos que me ajudaram a obter o conhecimento acima:
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
Qualquer ajuda é realmente apreciada.