Encontramos um problema na produção algumas vezes em que parece que um procedimento armazenado recebe um plano novo e ruim e começa a causar estragos. Infelizmente, não conseguimos capturar o plano antes e depois para ver como era o plano ruim antes de fazermos um dbcc freeproccache, também não temos o armazenamento de consultas configurado.
Minha pergunta é, o que tudo pode fazer com que o sql server gere um novo plano para um procedimento armazenado? Especialmente para um sp que é executado o tempo todo. Alguns dos que conheço são:
- dbcc freeproccache
- reiniciando o servidor
- opção recompilar
Para o SQL 2016, aqui está a lista por que 'statement_recompile_cause' pode acontecer.
Você pode obter a mesma lista para qualquer outra versão que suporte o rastreamento de eventos estendidos.
Algumas boas referências: