Farejamento de parâmetros


8

Eu usei dois métodos para solucionar problemas de detecção de parâmetros no passado:

1) Use WITH RECOMPILE
2) Reatribua valores de parâmetros para variáveis ​​locais e use-os em vez dos parâmetros

Pelo que entendi, o resultado final de ambos é o mesmo - um novo plano de execução otimizado para as consultas / parâmetros atuais é criado e usado.

Se isso for verdade, há alguma diferença entre esses dois métodos ou eles são essencialmente os mesmos? Um é preferível ao outro?

Respostas:


3

Se você pode antecipar valores típicos, execute seu procedimento armazenado com esses valores sempre que (re) criar. Um plano de execução será criado com base nesses valores e armazenado para uso futuro. A maioria dos meus .sqlarquivos de procedimento armazenado termina com um EXECcomando com valores razoáveis, exatamente para esse propósito (isso e para identificar erros básicos no código).

Obviamente, isso não ajudará se o procedimento armazenado for muito longo, o suficiente para que você não possa executá-lo razoavelmente durante o horário de produção. Observe que não é suficiente iniciar o trabalho, ele precisa ser concluído com êxito para que um plano seja armazenado.


4
  1. WITH RECOMPILE

Isso é meio que uma marreta. Ele recompila todas as instruções no módulo. Usar OPTION (RECOMPILE)as instruções sensíveis aos parâmetros é uma solução mais direcionada.

  1. Reatribua valores de parâmetros para variáveis ​​locais e use-os em vez dos parâmetros

Isso tem o mesmo efeito, OPTIMIZE FOR UNKNOWNou seja, um plano é gerado com base nos valores médios. O plano não é recompilado em cada execução.

Para obter mais informações, consulte o meu artigo Detecção de parâmetros, incorporação e as opções RECOMPILE .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.