2009-02-05 8 views
6

Tengo una serie de procedimientos almacenados que llamo desde el código con ExecuteNonQuery.¡Los procedimientos almacenados se agotan de manera intermitente!

todo era bueno, pero 2 de mis procedimientos almacenados comenzó el tiempo de espera de forma intermitente hoy con:

tiempo de espera agotado. El período de tiempo de espera transcurrió antes de la finalización de la operación o el servidor no está respondiendo . La declaración ha sido terminada.

Si ejecuto manualmente la sp desde el estudio de gestión, todo sigue siendo bueno.

Nada ha cambiado recientemente en mi db - el tiempo de espera de mi comando es el predeterminado.

¿Alguna pista?

EDITAR

la mesa contra los SP se están ejecutando es enorme -> 15 conciertos. Reiniciado el cuadro: el mismo problema, pero esta vez tampoco puede ejecutar el sp desde Management Studio.

Gracias!

+0

¿Está funcionando mucho más tiempo de lo esperado? ¿O es simplemente que se ejecuta durante años ** pero completa ** en el analizador de consultas? –

+0

funciona muy rápido en el estudio de gestión, por eso no creo que configurar el tiempo de espera ayudará a – JohnIdol

+0

Bueno, necesita averiguar si está bloqueado, o si tiene un plan de ejecución incorrecto ... –

Respuesta

2

Ok, así es como lo solucioné al final.

Un índice agrupado en una tabla con 45 millones de registros estaba matando a mi servidor SQL; cada inserción del código daba como resultado los desagradables tiempos de espera descritos en la respuesta. Aumentar la tolerancia de tiempo de espera no iba a resolver mis problemas de escalabilidad, así que jugué con índices y haciendo que el índice agrupado en la clave principal no agrupados se desbloqueara la situación.

Agradecería los comentarios sobre esto para comprender mejor cómo esto solucionó el problema.

+0

¿Estaba basado en el entero PK? Si lo fue, no tiene sentido agrupar los datos secuenciales (¿no?). Tuve situaciones en SQL2000 en las que se tuvo que recrear completamente una tabla antes de que se "reparara" un índice, que incluso la eliminación/reindexación no podía corregir. – Adam

+0

Sí, era un número entero; estaba agrupado de forma predeterminada, por lo que yo sé (no lo hice agrupado explícitamente) – JohnIdol

3

¿Está configurado el tiempo de espera del comando? ¿Ha cambiado recientemente algo en su base de datos que está causando que este proceso tome más tiempo?

Si tiene que diagnosticar problemas de bloqueo, necesitará usar algo como sp_lock.

¿Puedes compartir la fuente de uno de tus procs?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx

+0

Estoy haciendo bastante extensas transacciones - todo fue bien hasta hace unas horas - no estoy muy seguro de que establecer un tiempo de espera mayor ayudará. – JohnIdol

+0

Puede establecerlo en 0, lo que significa que no se agotará el tiempo de espera –

+0

Además, si es rápido en el estudio, tal vez una transacción lo está bloqueando. necesita diagnosticar con sp_lock –

7

Management Studio establece un tiempo de espera infinito en consultas/comandos que se ejecuta. Su conexión de base de datos desde el código tendrá un tiempo de espera predeterminado que puede cambiar en el command object.

+0

Puede inspeccionar las propiedades de conexión configurando un rastreo en SQL Server Profiler. Desde aquí, podrás ver la configuración de tiempo de espera predeterminada que se usa, si un valor no está explícitamente establecido dentro de tu código –

+0

Sin embargo, sucede bastante rápido en el estudio de administración (menos de 1 segundo) y en mi código se agota después de 30 segundos más o menos. – JohnIdol

+0

El tiempo de espera de conexión y el tiempo de espera del comando no deben confundirse, el tiempo de espera de conexión es el tiempo máximo que llevaría conectarse al db –

5

Esto puede a menudo se refieren a:

  • malos planes de consulta debido a un exceso de ganas plan de reutilización (parameter sniffing)
  • opciones conjunto diferente - en ANSI_NULLS particulares y CONCAT_NULL_YIELDS_NULL
  • bloqueo (que podría tener un nivel de aislamiento superior)
  • indexación necesita ser reconstruido/actualizado las estadísticas/etc

Las opciones SET pueden llevar a que ciertos tipos de índice no se puedan utilizar (índices en columnas calculadas persistentes, por ejemplo, incluidas las consultas "promocionadas" xml/udf)

+1

Buena llamada en el rastreo de parámetros, particularmente pertinente para SQL Server 2000. Entiendo que el rastreo de parmetros no es un problema en SQL Server 2005 en adelante. Buen artículo sobre cómo combatir el rastreo de parámetros aquí http://blogs.msdn.com/khen1234/archive/2005/06/02/424228.aspx –

+0

El olfateo de parámetros definitivamente es todavía un problema con SQL Server (hasta e incluyendo 2012) Pude replicar esto fácilmente en todas las versiones de SQL. Declarar una variable local para cada parámetro de proc almacenado y establecer Localparam1 = Param1 corrige los tiempos de espera en cada instancia. Me ha estado molestando por años. – Mangist

+0

@Mangist o simplemente use la sugerencia de consulta 'OPTIMIZE FOR' ... –

5

Intente volver a compilar estos procedimientos. Tuve tantos problemas pocas veces y no encontré la causa del problema, pero recompilar siempre ayuda.

EDIT:

recompilar proc, que ir al estudio de gestión, procedimiento abierto para modificar y presione F5 o ejecutar: EXEC sp_recompile 'proc_name'

+0

¡vale la pena intentarlo! ¿Cómo puedo hacer eso? – JohnIdol

+0

lo mejor es EXEC sp_recompile 'proc_name' –

+0

He visto esto pasar también a las vistas donde tienen que volver a crearse después de que las tablas de origen hayan cambiado. Definitivamente vale la pena intentarlo. – Adam

1

Es posible que tenga que actualizar las estadísticas sobre la base de datos. ¿También ha cambiado recientemente la indexación en la mesa?

Compruebe el plan de ejecución de la sp para ver si puede encontrar el cuello de botella. Incluso si se ejecutó bien antes, probablemente puede ajustarse para funcionar de manera más eficiente.

¿Además de cuántos datos está devolviendo? Hemos tenido problemas con el SQL mal diseñado en el pasado que no aparecía hasta que el informe acumulativo comenzaba a tener más datos en el conjunto de resultados. Al no saber lo que hacen sus sps, es difícil decir si esto es posible, pero vale la pena mencionar para que investigue.

1

SQL Server esperará indefinidamente antes de volver al usuario. Es más que probable que haya un conjunto de propiedades de tiempo de espera del lado del cliente. Por ejemplo, puede establecer un timeout property for the ADO command object.

0

Obtenga el generador de perfiles SQL, compare los resultados entre ejecutarlo en Management Studio y a través de su aplicación.

Cuestiones relacionadas