El procesamiento de grandes volúmenes de datos en SQL requiere un enfoque especial para evitar el desbordamiento de memoria, bloqueos y garantizar un rendimiento estable. Uno de los principales métodos es dividir las operaciones en lotes: los datos de entrada se procesan en porciones pequeñas, lo que reduce la carga en el servidor y permite un mejor control de las transacciones y los revertimientos en caso de errores.
Aspectos clave:
ROWCOUNT o LIMIT / TOP)COMMIT, para descargar el registro transaccionalEjemplo (SQL Server):
DECLARE @BatchSize INT = 1000; WHILE 1 = 1 BEGIN BEGIN TRANSACTION; DELETE TOP(@BatchSize) FROM BigLogTable WHERE CreatedDate < '2021-01-01'; IF @@ROWCOUNT = 0 BREAK; COMMIT TRANSACTION; END
¿Cómo eliminar 100 millones de registros de una gran tabla con el mínimo impacto en el rendimiento?
Respuesta incorrecta: "Hacer un solo DELETE grande".
Respuesta correcta: Eliminar en porciones (lotes) controlando el tamaño del lote, hacer COMMIT después de cada bloque, si es necesario reducir la carga en el disco y bloqueos utilizando pausas (WAITFOR DELAY o similar).
Ejemplo (PostgreSQL):
DO $$ BEGIN LOOP DELETE FROM big_table WHERE created_at < NOW() - interval '1 year' LIMIT 10000; EXIT WHEN NOT FOUND; COMMIT; END LOOP; END$$;
Historia
Proyecto: Servicio bancario de alta carga. Error: Un desarrollador realizó la eliminación de registros obsoletos con una sola consulta grande de 80 millones de filas. Resultado: el registro de transacciones creció a terabytes, se agotó todo el espacio de disco disponible, el servicio "cayó".
Historia
Proyecto: Tienda en línea con sistema de gestión de inventario. Error: Durante la inserción masiva, no se limitó el tamaño de la transacción. En el proceso de importación de lotes masivos, los registros fallaron, todo el trabajo anterior tuvo que ser revertido y repetido, tomó horas en lugar de minutos.
Historia
Proyecto: Minorista, base de datos de informes de detalle de pedidos. Error: Utilizaron lotes, pero olvidaron el COMMIT entre iteraciones — el registro transaccional creció exponencialmente, el servidor comenzó a "ralentizarse", y luego fue necesaria una limpieza de registros de emergencia con herramientas estándar.