Yo diría que esto es casi seguro que olfateó los parámetros.
A menudo se afirma que SET OPTIONS
puede afectar el rendimiento de esta manera, pero aún no he visto una única fuente autorizada para este reclamo, excepto en el caso de que esté utilizando Vistas indexadas / columnas calculadas persistentes.
En este caso (para SQL2005 + y a menos que su base de datos esté en modo de compatibilidad SQL2000 ). Si tiene ambos ARITHABORT
y ANSI_WARNINGS
OFF
luego encontrará que el índice no se está utilizando, puede tener un escaneo en lugar de la búsqueda deseada (y algunos gastos generales ya que el resultado del cálculo persistente no se puede usar). ADO.NET parece tener por defecto ANSI_WARNINGS ON
una prueba rápida que acabo de hacer.
La afirmación en la respuesta de Ben de que "la forma en que el servidor realiza los cálculos numéricos" puede agregar minutos a un resultado que de otro modo tomaría menos de un segundo, simplemente no me parece creíble. Creo que lo que suele suceder es que, al investigar un problema de rendimiento de rendimiento, Profiler se utiliza para identificar la consulta ofensiva. Esto se pega en el estudio de gestión y se ejecuta y devuelve resultados al instante. La única diferencia aparente entre las conexiones es la ARITH_ABORT
opción.
Una prueba rápida en una ventana del estudio de administración muestra que cuando SET ARITHABORT OFF
se activa y se ejecuta la consulta, el problema de rendimiento se repite, por lo que aparentemente se cierra el caso. De hecho, esta parece ser la metodología de solución de problemas utilizada en el enlace Gregg Stark .
Sin embargo, eso ignora el hecho de que con esa opción establecida, puede terminar obteniendo exactamente el mismo plan incorrecto del caché .
Esta reutilización del plan puede ocurrir incluso si ha iniciado sesión como un usuario diferente al que usa la conexión de la aplicación.
Probé esto ejecutando una consulta de prueba primero desde una aplicación web y luego desde el estudio de administración con SET ARITHABORT OFF
y pude ver los conteos de uso que suben de la consulta a continuación.
SELECT usecounts, cacheobjtype, objtype, text ,query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Para que este plan compartido pueda ocurrir, todas las claves de caché del plan deben ser las mismas. Además de arithabort
otros ejemplos, los usuarios que ejecutan necesitan el mismo esquema predeterminado (si la consulta se basa en una resolución de nombre implícita) y las conexiones necesitan el mismo language
conjunto.
Una lista más completa de las claves de caché del plan aquí