Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Quais fatores podem causar a recompilação de procedimento armazenado no SQL Server?


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:

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.