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.
fonte
Você tem muitos trabalhos do SQL Server em execução frequentemente nesta caixa? Observe que em 2005 as consultas de trabalho do agente NÃO são armazenadas em cache e também podem causar inchaço no cache e compilações sql.
Veja o número de planos com baixa contagem de reutilização. Esses são seus culpados.
Algumas notas relacionadas sobre o planejamento do cache abaixo.
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Plan-cache-adhoc-workloads-and-clearing-the-single-use-plan-cache-bloat.aspx
http://www.sqlskills.com/BLOGS/KIMBERLY/post/Clearing-the-cache-are-there-other-options.aspx
fonte
Esse efeito é conhecido como "poluição do plano de consulta", onde muitas consultas SQL semelhantes geram planos de execução separados, mas equivalentes.
As consultas ad-hoc causam sobrecarga pela análise individual, mas geralmente não poluem o plano de consulta, pois seus planos não são armazenados. Isso é diferente para consultas com apenas um parâmetro (no MS SQL Server); elas serão tratadas como uma consulta parametrizada.
Existem alguns casos típicos de poluição do plano de consulta:
fonte