Temos uma consulta específica do SQL Server 2008 (não um processo armazenado, mas a mesma sequência SQL - é executada a cada 5 minutos) que armazena em cache intermitentemente um plano de consulta muito ruim.
Essa consulta normalmente é executada em alguns milissegundos, mas com esse plano de consulta incorreto, leva mais de 30 segundos.
Como removo cirurgicamente apenas um plano de consulta em cache incorreto do SQL Server 2008, sem remover todo o cache de consulta no servidor de banco de dados de produção?
sql-server
sql-server-2008
cache
query
Jeff Atwood
fonte
fonte
Respostas:
Eu descobri algumas coisas
mostrará todos os planos de consulta em cache. Infelizmente, nenhum texto SQL é mostrado lá.
No entanto, você pode associar o texto SQL aos planos da seguinte maneira:
A partir daqui, é bastante trivial adicionar uma
WHERE
cláusula para encontrar o SQL que eu sei que está na consulta e então eu posso executar:para remover cada plano de consulta do cache do plano de consulta. Não é exatamente fácil ou conveniente, mas parece funcionar ..
edit: despejar todo o cache de consulta também funcionará e é menos perigoso do que parece, pelo menos na minha experiência:
fonte
Se você sabe como é o bom plano, use uma dica de plano .
Você não pode remover uma entrada de cache específica, mas pode limpar um conjunto de cache inteiro
DBCC FREESYSTEMCACHE(cachename/poolname)
.Você pode obter o nome do cache de um plano de consulta incorreto se tiver o identificador do plano (em sys.dm_exec_requests.plan_handle para o session_id com problemas durante a execução ou em sys.dm_exec_query_stats após a execução):
No entanto, todos os planos SQL têm o nome 'SQL Plans', o que torna a escolha certa para o DBCC FREESYSTEMCACHE uma escolha difícil.
Atualizar
Deixa pra lá, esqueci
DBCC FREEPROCCACHE(plan_handle)
, sim, isso vai funcionar.fonte
sys.dm_exec_cached_plans
não houver nenhuma entrada para oplan_handle
fromsys.dm_exec_requests
?O FREEPROCCACHE solução é boa, mas uma maneira mais direta de fazer isso é usar OPTION (RECOMPILE) em sua String SQL (você mencionou que não era um SP); isso informa ao mecanismo que é um plano de uso único, porque provavelmente você suspeita há Detecção de Parâmetros ou suas Estatísticas são drasticamente diferentes de execução para execução e você suspeita que seja um problema de Plano em Cache Incorreto.
fonte