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

O uso de variáveis ​​na consulta gera um plano de consulta diferente


Porque quando você usa valores FIXED com AUTO-PARAMETERIZATION desativado, o plano de consulta sabe EXATAMENTE para qual valor ele precisa executar a consulta. Assim, o plano está sintonizado ESPECIFICAMENTE para esses valores.

Porém quando você utiliza variáveis, o plano que será colocado no Query Cache é aquele que contém as variáveis ​​parametrizadas - que podem ser substituídas por qualquer variável e irão reutilizar o mesmo plano. Portanto, esses planos terão que ser mais robustos e genéricos para lidar com o "melhor caso médio".

No SQL Server 2008, você pode definir se os parâmetros simples são ou não parametrizados automaticamente para obter consistentemente o plano de "melhor caso médio" - com todas as suas vantagens e desvantagens.

Ref.:

EDITAR - no desempenho


Quanto ao desempenho, o otimizador pode errar - neste caso, ele analisou as estatísticas for the exact values e senti que o índice não é útil (pode ser um problema de ponto de inflexão), então o plano é para varredura em cluster. É uma bela arte forçar um plano de consulta - mas claramente usar um índice é 50% mais rápido para
  1. hardware específico
  2. distribuição de dados de ponto específico no tempo
  3. valores específicos fornecidos

A menos que eu tivesse uma razão muito, muito boa, eu não jogaria o Otimizador de Consulta (por exemplo, usando dicas de índice), a menos que eu tenha muitos dados para provar que ele invariavelmente o tornará mais rápido.