2008-08-13 19 views
27

Esta es una pregunta que hice en otro foro que recibió algunas respuestas decentes, pero quería ver si alguien aquí tiene más información.Consulta tiempo de espera desde la aplicación web, pero funciona bien desde el estudio de administración

El problema es que tiene una de sus páginas en una aplicación web que se agota cuando se trata de una llamada de procedimiento almacenado, por lo que usa Sql Profiler o los registros de seguimiento de la aplicación para buscarla y pegarla en estudio de gestión para entender por qué se está ejecutando lentamente. Pero lo ejecutas desde allí y sigue ardiendo, volviendo en menos de un segundo cada vez.

Mi caso particular fue el uso de ASP.NET 2.0 y Sql Server 2005, pero creo que el problema podría aplicarse a cualquier sistema RDBMS.

+0

Tuve el mismo problema y http://stackoverflow.com/questions/250713/sqldataadapter-fill-method-slow resolvió mi problema – David

Respuesta

26

Esto es lo que he aprendido hasta el momento de mi investigación.

.NET envía configuraciones de conexión que no son las mismas que las que obtiene cuando inicia sesión en Management Studio. Aquí es lo que se ve si oler la conexión con SQL:

-- network protocol: TCP/IP 
set quoted_identifier off 
set arithabort off 
set numeric_roundabort off 
set ansi_warnings on 
set ansi_padding on 
set ansi_nulls off 
set concat_null_yields_null on 
set cursor_close_on_commit off 
set implicit_transactions off 
set language us_english 
set dateformat mdy 
set datefirst 7 
set transaction isolation level read committed 

ahora estoy pegando los que arreglan por encima de todas las consultas que corro cuando se conecte al servidor SQL, para asegurarse de que los ajustes son los mismos.

Para este caso, probé cada configuración individualmente, después de desconectar y volver a conectar, y encontré que cambiar arithabort de apagado a encendido reducía la consulta de problema de 90 segundos a 1 segundo.

La explicación más probable está relacionada con el rastreo de parámetros, que es una técnica que Sql Server utiliza para elegir lo que cree que es el plan de consulta más efectivo. Cuando cambia una de las configuraciones de conexión, el optimizador de consultas puede elegir un plan diferente, y en este caso, al parecer eligió uno malo.

Pero no estoy totalmente convencido de esto. Intenté comparar los planes de consulta reales después de cambiar esta configuración y aún no he visto el diff mostrar ningún cambio.

¿Hay algo más acerca de la configuración de arithabort que podría ocasionar que una consulta se ejecute lentamente en algunos casos?

La solución parecía simple: simplemente ponga set arithabort en la parte superior del procedimiento almacenado. Pero esto podría conducir al problema opuesto: cambiar los parámetros de consulta y de repente se ejecuta más rápido con 'apagado' que 'encendido'.

Por el momento estoy ejecutando el procedimiento 'con recompilación' para asegurarme de que el plan se regenere cada vez. Está bien para este informe en particular, ya que lleva aproximadamente un segundo recompilar, y esto no es demasiado notorio en un informe que demora de 1 a 10 segundos en regresar (es un monstruo).

Pero no es una opción para otras consultas que se ejecutan con mucha más frecuencia y necesitan regresar lo más rápido posible, en solo unos pocos milisegundos.

+1

+1 Tomar esas configuraciones de SQL Profiler y pegarlas en Management Studio es un gran consejo y me ayudó muchísimo. –

+3

+1 SET ARITHABORT OFF fue suficiente para que mi consulta de tiempo de espera anterior comenzara a funcionar maravillosamente. – Spud

+1

@ eric-z-beard ¿Dónde pones estos valores? Dentro del SP o antes de EXEC sp_whatever from .NET – djandreski

0

intente cambiar el valor de tiempo de espera SelectCommand:

DataAdapter.SelectCommand.CommandTimeout = 120; 
+0

¡No es una solución! ¡Es una solución! – Icet

1

prueba de esto en una caja de montaje en primer lugar, cambiar en un nivel de servidor para el servidor SQL

declarar @option int

conjunto @option = @@ opciones | 64

exec sp_configure '' opciones de usuario, @option

reconfigurar

2

¿Ha encendido ASP.NET sin embargo, el rastreo? Tuve una instancia en la que no era el procedimiento almacenado SQL el problema, era el hecho de que el procedimiento devolvió 5000 filas y la aplicación intentaba crear elementos de lista vinculados con los 5000 elementos que causaban el problema.

lo podría hacer en los tiempos de ejecución entre las funciones de aplicaciones web, así través de la traza para ayudar a rastrear las cosas.

0

Usted podría tratar de usar el comando sp_who2 para ver cuál es el proceso en cuestión está haciendo. Esto le mostrará si está bloqueado por otro proceso o si usa una cantidad excesiva de CPU y/o tiempo.

1

Mismo problema que tuve con los servicios de informes SQL. tratar de comprobar el tipo de variables, estaba enviando diferentes tipos de variables a SQL como el envío de varchar en el lugar donde debe ser número entero, o algo por el estilo. Después de sincronizar los tipos de variables en Reporting Service y en el procedimiento almacenado en SQL, resolví el problema.

6

He tenido problemas similares. Intente configurar la opción "WITH RECOMPILE" en sproc create para forzar al sistema a volver a calcular el plan de ejecución cada vez que se llame. Algunas veces, el procesador de Query se confunde en complejos procedimientos almacenados con muchas ramificaciones o declaraciones de casos y simplemente extrae un plan de ejecución realmente poco óptimo. Si eso parece "arreglar" el problema, probablemente necesite verificar que las estadísticas estén actualizadas y/o desglosar el sproc.

También puede confirmar esto mediante el perfilado del procedimiento almacenado. Cuando lo ejecuta desde SQL Managment Studio, ¿cómo se compara el IO con cuando lo perfila desde la aplicación ASP.NET? Si lo hacen mucho, solo refuerza que está tirando de un mal plan de ejecución.

0

Tuvimos el mismo problema y esto es lo que descubrimos.

el tamaño de nuestra base de datos de registro se mantenía en el valor predeterminado (814 MB) y el crecimiento de automóviles fue del 10%. En el servidor, la memoria máxima del servidor también se mantuvo en la configuración predeterminada (2147483647 MB).

Cuando nuestro registro se llenó y se necesita para crecer, que utiliza toda la memoria del servidor y no queda nada para la ejecución de código por lo que tiempo de espera. Lo que terminamos haciendo fue establecer el tamaño inicial del archivo de registro de la base de datos a 1 MB y la memoria máxima del servidor a 2048 MB. Esto solucionó nuestro problema al instante. Por supuesto, puede cambiar estas dos propiedades para adaptarlas a sus necesidades, pero esta es una idea para alguien que está teniendo problemas de tiempo cuando ejecuta un procedimiento almacenado a través de un código pero funciona muy rápido en SSMS y las soluciones anteriores no ayudan.

Cuestiones relacionadas