Me gustaría obtener algunas ideas / razonamientos adicionales para el comportamiento de eliminación de SQL Server. Tenemos una base de datos bastante grande de más de 1800 GB.
Hay algunas tablas muy poco profundas (solo unas pocas columnas enteras) con muchos millones de filas. Cuando eliminamos 10,000s de filas de estas tablas poco profundas, las consultas de eliminación son generalmente bastante rápidas (a lo sumo unos pocos segundos).
También tenemos una tabla con un campo de tipo que image
almacena imágenes con un promedio de 100 KB. Cuando eliminamos solo unos pocos miles de filas de esta tabla, lleva más de un minuto.
Aunque la diferencia es clara (se eliminan muchos más datos en cuanto al tamaño), estoy ansioso por aprender más sobre lo que sucede dentro de SQL Server. Para que pueda entender mejor, este último borrado es mucho más lento.
¿Alguien puede arrojar algo de luz?
fuente
Respuestas:
Eliminar un
image
blob de 100 kb en realidad no es una operación de tamaño de datos. El blob se desasigna, no se elimina, y no hay registro de imagen completa. Puedes probar esto fácilmente:Los registros de registro que verá serán algo como:
Como puede ver, no hay un registro 'BORRAR' con +102400 bytes de datos para la fila que contiene la
image
columna. Hay un montón de desasignaciones (la operación PFS / IAM / GAM) y una simple eliminación de fila (montón en mi caso, se vería muy similar para B-Tree si hubiera recordado declarar ID como PK ...). Para obtener más detalles, consulte Cómo leer e interpretar el registro de SQL Server .Lo que deja abierta la pregunta original: ¿por qué una eliminación es más lenta que la otra? Le recomiendo que lea Cómo analizar el rendimiento de SQL Server . Siga la metodología descrita para capturar las esperas de una declaración específica y ver cuál es la causa. Consulte Análisis de ejecución de consultas individuales , especialmente la parte sobre Análisis de tiempos de espera de ejecución de consultas individuales. Solo después de que hayas medido podremos responder el enigma. Podría haber muchos factores: más bloqueo debido a lecturas concurrentes en la tabla de blobs, índices faltantes para ubicar las filas candidatas de ELIMINAR en una tabla, activadores que se ejecutan, etc. La metodología vinculada le ayudará a identificar la causa.
fuente