usar update tiempo registros mismo matched mas insertar example ejemplo como comando actualizar sql sql-server database nhibernate timeout

update - SQL Server simple Insertar declaración agota el tiempo



sql server merge example insert update (6)

Tengo una tabla simple con 6 columnas. La mayoría de las veces, las instrucciones de inserción funcionan bien, pero de vez en cuando recibo una excepción de DB Timeout: el tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.

El tiempo de espera se establece en 10 segundos.

Debo mencionar que estoy usando NHibernate y que la declaración también incluye un "select SCOPE_IDENTITY ()" justo después de la inserción.

Mi idea era que la mesa estaba cerrada o algo así, pero no había otras declaraciones ejecutándose en esa mesa en ese momento.

Todas las inserciones son muy simples, todo parece normal en el generador de perfiles sql, la tabla no tiene índices, pero la PK (plenitud de página: 98.57%).

¿Alguna idea sobre qué debería buscar?

Gracias.


no hay otras declaraciones ejecutándose en esa tabla en ese momento.

¿Qué pasa con las declaraciones ejecutándose contra otras tablas como parte de una transacción? Eso podría dejar bloqueos en la tabla de problemas.

También compruebe si el archivo de registro o el crecimiento de los archivos de datos suceden en ese momento; si está ejecutando SQL2005, se mostraría en los registros de errores de SQL.


mira la fragmentación de la tabla, podrías obtener divisiones de página debido a eso


Podría ser que la tabla esté tardando mucho tiempo en crecer.

Si tiene la tabla configurada para crecer en una gran cantidad, y no tiene habilitada la inicialización instantánea de archivos, entonces la consulta podría sin duda agotar el tiempo de vez en cuando.

Mira este desastre: MSDN


Nuestro control de calidad tenía algunas conexiones de Excel que devolvían grandes conjuntos de resultados, esas consultas se suspendieron con WaitType de ASYNC_NETWORK_IO durante algún tiempo. Durante este tiempo, se agotó el tiempo de espera de todas las demás consultas, por lo que la inserción específica no tuvo nada que ver con eso.


Esta pregunta parece un buen lugar para un fragmento de código que solía ver el texto SQL real de las consultas bloqueadas y bloqueadas.

El siguiente fragmento emplea la convención de que SP_WHO2 devuelve "." texto para BlockedBy para las consultas no bloqueadas, por lo que las filtra y devuelve el texto SQL de las consultas restantes (tanto "víctima" como "culpable"):

--prepare a table so that we can filter out sp_who2 results DECLARE @who TABLE(BlockedId INT, Status VARCHAR(MAX), LOGIN VARCHAR(MAX), HostName VARCHAR(MAX), BlockedById VARCHAR(MAX), DBName VARCHAR(MAX), Command VARCHAR(MAX), CPUTime INT, DiskIO INT, LastBatch VARCHAR(MAX), ProgramName VARCHAR(MAX), SPID_1 INT, REQUESTID INT) INSERT INTO @who EXEC sp_who2 --select the blocked and blocking queries (if any) as SQL text SELECT ( SELECT TEXT FROM sys.dm_exec_sql_text( (SELECT handle FROM ( SELECT CAST(sql_handle AS VARBINARY(128)) AS handle FROM sys.sysprocesses WHERE spid = BlockedId ) query) ) ) AS ''Blocked Query (Victim)'', ( SELECT TEXT FROM sys.dm_exec_sql_text( (SELECT handle FROM ( SELECT CAST(sql_handle AS VARBINARY(128)) AS handle FROM sys.sysprocesses WHERE spid = BlockedById ) query) ) ) AS ''Blocking Query (Culprit)'' FROM @who WHERE BlockedById != '' .''


Creo que tu culpable más probable es un bloqueo de bloqueo de otra transacción (o tal vez de un disparador o algo más detrás de escena).

La forma más fácil de hacerlo es iniciar el INSERT , y mientras está colgado, ejecute EXEC SP_WHO2 en otra ventana en el mismo servidor. Esto mostrará una lista de toda la actividad actual de la base de datos, y tiene una columna llamada BLK que le mostrará si algún proceso está actualmente bloqueado. Compruebe el SPID de su conexión colgada para ver si tiene algo en la columna BLK , y si lo hace, ese es el proceso que lo está bloqueando.

Incluso si no cree que haya otras declaraciones ejecutándose, la única forma de estar seguro es hacer una lista de las transacciones actuales usando un SP como ese.