Editar: Resuelto, había un disparador con un bucle en la tabla (lea mi propia respuesta más adelante).ELIMINAR instrucción se bloquea en SQL Server sin motivo aparente
Tenemos una simple declaración de eliminación que se parece a esto:
DELETE FROM tablename WHERE pk = 12345
Esto sólo se bloquea, sin tiempo de espera, nada de nada.
Hemos examinado el plan de ejecución, y consiste en muchas búsquedas en tablas relacionadas para asegurar que ninguna clave externa pueda desconectar la eliminación, pero hemos verificado que ninguna de esas otras tablas tiene filas que se refieran a esa fila particular
No hay otro usuario conectado a la base de datos en este momento.
Hemos ejecutado DBCC CHECKDB en su contra e informa 0 errores.
En cuanto a los resultados de sp_who
y sp_lock
mientras la consulta está colgando, noto que mi SPID tiene un montón de PAG y cerraduras con llave, así como el bloqueo TAB ocasional.
La tabla tiene 1.777.621 filas, y sí, pk es la clave principal, por lo que es una eliminación de fila única basada en el índice. No hay escaneo de tabla en el plan de ejecución, aunque noto que contiene algo que dice Table Spool (Eager Spool), pero dice Cantidad estimada de filas 1. ¿Puede ser esto realmente un escaneo de tabla disfrazado? Solo dice que mira la columna de la clave principal.
Intenté DBCC DBREINDEX y UPDATE STATISTICS en la tabla. Ambos se completaron dentro de un tiempo razonable.
Desafortunadamente hay una gran cantidad de índices en esta tabla en particular. Es la tabla central en nuestro sistema, con muchas columnas y referencias, tanto de entrada como de salida. El número exacto es de 48 índices + el índice agrupado de clave principal.
¿Qué más deberíamos ver?
Tenga en cuenta también que esta tabla no tenía este problema antes, este problema ocurrió repentinamente hoy. También tenemos muchas bases de datos con la misma configuración de tabla (copias de bases de datos de clientes), y se comportan como se espera, es solo esta la que es problemática.
Arreglaste el gatillo para no usar un bucle ¿no? Un disparador casi nunca debe contener un cursor o un bucle. – HLGEM