Parámetros husmeando

8

He usado dos métodos para solucionar problemas de detección de parámetros en el pasado:

1) Usar WITH RECOMPILE
2) Reasignar valores de parámetros a variables locales y usarlos en lugar de los parámetros

Por lo que entiendo, el resultado final de ambos es el mismo: se crea y utiliza un nuevo plan de ejecución que está optimizado para la consulta / parámetros actuales.

Si esto es cierto, ¿hay alguna diferencia entre estos dos métodos o son esencialmente los mismos? ¿Es preferible uno sobre el otro?

Abe Miessler
fuente

Respuestas:

3

Si puede anticipar valores típicos, ejecute su procedimiento almacenado con dichos valores cada vez que lo (re) cree. Se creará un plan de ejecución basado en estos valores y se almacenará para su uso futuro. La mayoría de mis .sqlarchivos de procedimientos almacenados terminan con un EXECcomando con valores razonables, exactamente para este propósito (eso, e identificar errores básicos en el código).

Por supuesto, esto no ayudará si su procedimiento almacenado es muy largo, lo suficiente como para que no pueda ejecutarlo razonablemente durante las horas de producción. Tenga en cuenta que no es suficiente comenzar el trabajo, debe completarse con éxito para que se almacene un plan.

Jon de todos los oficios
fuente
4
  1. WITH RECOMPILE

Esto es un poco un mazo. Recompila cada declaración en el módulo. El uso OPTION (RECOMPILE)de las declaraciones que son sensibles a los parámetros es una solución más específica.

  1. Reasigne valores de parámetros a variables locales y utilícelos en lugar de los parámetros

Esto tiene el mismo efecto que, OPTIMIZE FOR UNKNOWNes decir, se genera un plan basado en valores promedio. El plan no se vuelve a compilar en cada ejecución.

Para obtener más información, consulte mi artículo Detección de parámetros, incrustación y las opciones RECOMPILAR .

Paul White 9
fuente