2008-09-11 24 views
8

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.

Respuesta

4

Una pieza de información que falta es el número de índices en la tabla que va a eliminar los datos. Como SQL Server usa la clave principal como un puntero en cada índice, cualquier cambio en el índice primario requiere la actualización de cada índice. Sin embargo, a menos que estemos hablando de un número alto, esto no debería ser un problema.

Supongo, por su descripción, que esta es una tabla primaria en la base de datos, a la que hacen referencia muchas otras tablas en las relaciones FK. Esto explicaría la gran cantidad de bloqueos, ya que verifica el resto de las tablas en busca de referencias.Y, si tiene activadas las eliminaciones en cascada, esto podría llevar a una eliminación en la tabla a que requiere verificaciones de varias tablas de profundidad.

1

Ok, esto es vergonzoso.

Un colega había agregado un disparador a esa mesa hace un tiempo, y el gatillo tenía un error. A pesar de que había arreglado el error, el disparador nunca había sido recreado para esa mesa.

Así que el servidor en realidad no estaba haciendo nada, simplemente lo hizo una gran cantidad de veces.

Oh, bueno ...

Gracias por los globos oculares a todos los que lean esto y se preguntaba el problema.

Voy a aceptar la respuesta de Josef, ya que la suya fue la más cercana e indirectamente tocó el tema con las eliminaciones en cascada.

+0

Arreglaste el gatillo para no usar un bucle ¿no? Un disparador casi nunca debe contener un cursor o un bucle. – HLGEM

Cuestiones relacionadas