Estou correto ao dizer que as estatísticas são usadas apenas ao criar o plano de execução para um procedimento armazenado e não são usadas no contexto de execução real?
Não, o que acontece é que o plano de execução de um procedimento armazenado é armazenado em cache. Supondo que haja memória disponível suficiente para continuar mantendo o plano, ele não será alterado a menos que ocorra uma das seguintes situações (em Cache e Reutilização do Plano de Execução na documentação do SQL Server, ênfase adicionada):
- Alterações feitas em uma tabela ou exibição referenciada pela consulta (ALTER TABLE e ALTER VIEW).
- Alterações feitas em um único procedimento, o que eliminaria todos os planos desse procedimento do cache (ALTER PROCEDURE).
- Alterações em quaisquer índices usados pelo plano de execução.
- Atualizações nas estatísticas usadas pelo plano de execução, geradas explicitamente a partir de uma instrução, como UPDATE STATISTICS, ou geradas automaticamente.
- Descartar um índice usado pelo plano de execução.
- Uma chamada explícita para sp_recompile.
- Grande número de alterações nas chaves (geradas pelas instruções INSERT ou DELETE de outros usuários que modificam uma tabela referenciada pela consulta).
- Para tabelas com gatilhos, se o número de linhas nas tabelas inseridas ou excluídas aumentar significativamente.
- Executando um procedimento armazenado usando a opção WITH RECOMPILE.
Portanto, se as estatísticas forem atualizadas, o plano em cache levará automaticamente em consideração as novas estatísticas e será recompilado.
Como você evita que os planos de execução se tornem obsoletos quando você adiciona cem mil linhas por dia?
Uma maneira é se houver muitas atualizações na tabela, conforme mencionado acima. Algumas centenas de milhares de linhas alteradas podem satisfazer essa condição. Mas se você quiser ter certeza ou ter um controle mais granular: atualize suas estatísticas. Você pode permitir que o SQL Server crie e gerencie estatísticas automaticamente ou faça você mesmo manualmente. Você pode encontrar mais informações sobre ambos os métodos nas opções Atualização automática do SQL Server e Criação automática de estatísticas . Quando / se você fizer uma recriação semanal de índices, isso também acionará os planos para serem atualizados. Faça alguns testes para ver o que é mais benéfico para você, pois a atualização de estatísticas com muita frequência pode não produzir resultados reais de desempenho.
Se estivermos atualizando estatísticas frequentemente para combater esse problema, faria sentido usar a dica OPTION (RECOMPILE) na consulta deste procedimento armazenado?
Você não precisa usar RECOMPILE
, pois com base no trecho acima, é possível ver que o plano de execução é atualizado adequadamente sempre que novas estatísticas estão disponíveis. Talvez você esteja bem com uma atualização de estatísticas do final do dia (se você estiver realmente preocupado), mas não acho que seja explicitamente uma necessidade com base no que você disse até agora. Mais uma vez, porém, eu o testaria para ver qual impacto isso poderia ter no desempenho do procedimento armazenado e planejaria adequadamente.
RECOMPILE
não causaria uma atualização de estatísticas de qualquer maneira.