Así que he determinado que el comportamiento errático de mi SQL Server se debe a la configuración predeterminada de .Net SqlClient Data Provider de SET ARITHABORT OFF
. Dicho esto, he leído varios artículos que debaten la mejor manera de implementar esto. Para mí, solo quiero una manera fácil porque SQL Server está sufriendo y mi ajuste de consultas no ha trascendido completamente a través de la aplicación (y obviamente agregar el SET
en un sp NO FUNCIONA).
En el brillante artículo de Erland Sommarskog sobre el tema, básicamente sugiere adoptar un enfoque seguro alterando la aplicación para emitir SET ARITHABORT ON
la conexión. Sin embargo, en esta respuesta de una pregunta dba.stackexchange , Solomon Rutzky ofrece un enfoque tanto para la instancia como para la base de datos.
¿Qué ramificaciones me estoy perdiendo aquí al configurar esta instancia en toda la instancia? Tal como lo veo ... ya que SSMS tiene este conjunto ON
por defecto, no veo ningún daño en configurar este ON
servidor para todas las conexiones. Al final del día, solo necesito que este SQL Server funcione por encima de todo lo demás.
fuente
ARITHABORT OFF
, entonces está bien. Manténgalo apagado para todas las conexiones entrantes. (Buena suerte controlando eso). Pero cuando entra una conexión configurada en ON, SQL genera un nuevo plan de consulta y esto podría afectar el rendimiento. Mi opinión, configúrelo como la opción de usuario predeterminada en el nivel de instancia y ajuste las consultas en consecuencia.Respuestas:
Existen algunos valores predeterminados simplemente porque nadie sabe realmente cuál sería el efecto de cambiarlos. Por ejemplo, la clasificación predeterminada de nivel de instancia cuando se instala en un sistema que usa "inglés de EE. UU." Como el idioma del sistema operativo
SQL_Latin1_General_CP1_CI_AS
. Esto no tiene sentido ya que lasSQL_*
intercalaciones son para compatibilidad anterior a SQL Server 2000. A partir de SQL Server 2000, en realidad podría elegir una intercalación de Windows, por lo que el valor predeterminado para los sistemas de inglés de EE. UU. Debería haberse cambiado aLatin1_General_CI_AS
. PERO, supongo que nadie en Microsoft realmente sabe cuál será el impacto en todos los diversos subsistemas potenciales y procedimientos almacenados del sistema, etc.Por lo tanto, no tengo conocimiento de ningún impacto negativo específico de establecerlo en ON como valor predeterminado de la base de datos o incluso en toda la instancia. Al mismo tiempo, no lo he probado. Pero incluso si lo hubiera probado, aún podría no usar las mismas rutas de código que su aplicación, por lo que esto es algo que realmente necesita probar en su entorno. Establecerlo en
ON
a nivel de instancia en sus entornos de desarrollo y control de calidad y vea cómo funciona durante un mes o dos. Luego habilítelo en Staging / UAT. Si todo continúa bien durante varias semanas, pasa el cambio de configuración a Producción. La clave es dar el mayor tiempo posible para probar varias rutas de código que no se aplican diariamente. Algunos son golpeados semanalmente o meses o anualmente. Algunas rutas de código solo se ven afectadas por el soporte, o algún informe ad hoc o proceso de mantenimiento que alguien creó hace años y que nunca le contó y solo se usa a intervalos aleatorios (nah, eso nunca sucede ;-).Entonces, hice algunas pruebas en una instancia que todavía tiene la configuración predeterminada de "opciones de usuario" ya que nunca la he cambiado.
Tenga en cuenta:
@@OPTIONS
/'user options'
es un valor enmascaradoARITHABORT ON
PREPARAR
Probé con SQLCMD (que usa ODBC) y LINQPad (que usa .NET SqlClient):
(este
^
es el carácter de continuación de línea de DOS; el.
de la última línea es solo para forzar la línea adicional para que sea más fácil copiar y pegar)En LINQPad:
PRUEBA 1: Antes
SQLCMD devuelve:
LINQPad devuelve:
CAMBIAR LA OPCIÓN DE CONEXIÓN POR DEFECTO:
El siguiente T-SQL se habilita
ARITHABORT
sin eliminar ninguna otra opción que pueda establecerse, y sin cambiar nada siARITHABORT
ya está configurado en el valor de máscara de bits.PRUEBA 2: Después
SQLCMD devuelve:
LINQPad devuelve:
Conclusión
Dado que:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, por lo tanto, aceptan la configuración predeterminadaSugeriría cambiar las opciones de conexión predeterminadas de toda la instancia (como se muestra arriba). Esto sería menos molesto que actualizar la aplicación. Solo actualizaría la aplicación si encuentra un problema al cambiar la configuración de toda la instancia.
PD: hice una prueba simple con cambiar
tempdb
y no cambiar la configuración de toda la instancia y no parecía funcionar.fuente
SET ARITHABORT OFF
está presente. Entonces, ¿por qué preocuparse de que esté presente? la única instancia que hemos visto donde se anula el valor predeterminado es SSMS configurándolo en (que es algo bueno). De cualquier manera, he actualizado mi respuesta con pruebas y lo que veo como la recomendación más lógica (según la información existente).ON
ARITHABORT OFF
si encuentra alguna incidencia real de la misma. Hasta ahora probablemente no haya ninguno. 3) Dado que esto afecta los planes de consulta, podría ser que las tablas nunca tuvieran suficientes datos para hacer que SQL Server tenga ciertas opciones a considerar, donde ahora hay más opciones y algunas son malas. O tal vez hay otros factores transitorios, como estadísticas desactualizadas, etc. No estoy completamente seguro.