Existem algumas maneiras de garantir a recompilação de um procedimento armazenado:
- usando
WITH RECOMPILE
, - tornando o procedimento armazenado dinâmico (pense em
exec()
) - marcando o proc para recompilação com
sp_recompile
. - alterando o esquema do qual um plano de consulta em cache depende
- chamando
DBCC FREEPROCCACHE
- No nível de consulta, uma instrução individual dentro de um proc pode ser recompilada com a dica de consulta RECOMPILE (SQL 2008).
Fatores na recompilação
Além dos fatores de hardware listados acima, o que causa a recompilação do procedimento armazenado? Bem, muitas coisas. Alguns deles estão entrelaçados com a lista acima, mas quero reapresentá-los porque pode não ser óbvio.
- Inserindo ou excluindo muitos dados (a densidade de dados em índices e tabelas geralmente controla os planos de consulta)
- Reconstruindo índices (uma alteração nos objetos subjacentes)
- Criar/descartar tabelas temporárias (novamente, alterações de DML subjacentes).
- plano de consulta envelhece (acho que não foi usado recentemente e o sql quer limpar o uso de memória)
Esta não é de maneira alguma uma lista exaustiva. O otimizador de consultas evolui e surpreende, não importa há quanto tempo você esteja usando o SQL Server. Mas aqui estão alguns recursos que podem ser úteis:
- Solucionando problemas de recompilação de procedimento armazenado (um velho, mas um presente)
- Recompling Stored Procedures
- Otimizando procedimentos armazenados do SQL Server para evitar recompilações
- Plano de execução de cache e reutilização (leitura obrigatória)
MAS ESPERE - TEM MAIS!
Com isso dito, a presunção em sua pergunta é que as recompilações são sempre ruins para o desempenho. Na verdade, muitas vezes a recomplicação é boa.
Então, quando você quer que ele recompile? Vejamos um exemplo de um proc que pesquisa pelo sobrenome. Os procedimentos armazenados fazem 'sniffing de parâmetros ' que é uma benção (se funciona para você) e uma maldição (se funciona contra você). Primeiro, passe alguém pesquisando em
Zebr%
para Zerbrowski. O índice de sobrenome percebe que isso é muito específico e retornará, digamos, 3 linhas de um milhão -- então um plano de execução é construído. Com o proc compilado para um resultado de linha baixa, a próxima pesquisa é por S%
. Bem, S é o seu nome mais comum e corresponde a 93.543 linhas de 1 milhão.