Tengo una base de datos SQL Server 2005, e intenté poner índices en los campos apropiados para acelerar el DELETE
de registros de una tabla con millones de filas (big_table
tiene solo 3 columnas) , pero ahora el tiempo de ejecución DELETE
es incluso más largo! (1 hora frente a 13 min, por ejemplo)SQL Server DELETE es más lento con los índices
Tengo una relación entre tablas, y la columna por la que filtro mi DELETE
está en la otra tabla. Por ejemplo
DELETE FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
Por cierto, también he intentado:
DELETE FROM big_table
WHERE EXISTS
(SELECT 1 FROM small_table
WHERE small_table.id_product = big_table.id_product
AND small_table.id_category = 1)
y al mismo tiempo parece correr un poco más rápido que el primero, es todavía mucho más lento con los índices que sin ellos.
creé índices en estos campos:
big_table.id_product
small_table.id_product
small_table.id_category
Mi archivo .ldf crece mucho durante el DELETE
.
¿Por qué mis consultas DELETE
son más lentas cuando tengo índices en mis tablas? Pensé que se suponía que debían correr más rápido.
ACTUALIZACIÓN
acuerdo, el consenso parece ser índices se ralentizará un enorme DELETE
becuase el índice tiene que ser actualizado. Aunque, todavía no entiendo por qué no puede DELETE
todas las filas a la vez, y simplemente actualizo el índice una vez al final.
Tenía la impresión de que algunos de mis lecturas indicaban que los índices acelerarían DELETE
al hacer búsquedas más rápidas de campos en la cláusula WHERE
.
"índices de trabajo igual de bien en la búsqueda de un registro de comandos borrar y actualizar al igual que para las instrucciones SELECT".
Pero más adelante en el artículo, dice que demasiados índices pueden perjudicar el rendimiento.
Las respuestas a las preguntas bobs:
- 55 millones de filas de la tabla
- 42 millones de filas que se eliminan
- similares
SELECT
declaración no iría (excepción de tipo 'del sistema.OutOfMemoryException' fue lanzado)
probé las siguientes 2 preguntas:
SELECT * FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
SELECT * FROM big_table
INNER JOIN small_table
ON small_table.id_product = big_table.id_product
WHERE small_table.id_category = 1
Tanto fallidos después de correr durante 25 min con este mensaje de error de SQL Server 2005:
An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
El servidor de la base de datos es una máquina Xeon dual core más antigua con 7,5 GB ram. Es mi base de datos de prueba de juguetes :) por lo que no está ejecutando nada más.
¿Debo hacer algo especial con mis índices después de I CREATE
para que funcionen correctamente?
¿Cuántas filas están en la mesa? ¿Cuántas filas se están eliminando? ¿Cuánto tiempo tomaría una declaración SELECT similar para completar? Saber qué tan rápido toma la instrucción SELECT puede dar una idea de cómo los índices afectan a DELETE. – bobs
filas de 55 mil, 42 eliminadas, no completadas, consulte más arriba para obtener más detalles – JohnB
Se necesita más tiempo porque cuando realiza una eliminación, los índices que hacen referencia a su tabla también deben actualizarse. – WOPR