La inserción masiva de datos (bulk insert) es una tarea típica al migrar, importar o llenar grandes tablas. La eficacia de esta operación depende de varios factores:
BULK INSERT o COPY (PostgreSQL) — funcionan más rápido que las inserciones normales en un bucle.BULK INSERT my_table FROM 'C:\data\bulkdata.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = ' ', BATCHSIZE = 5000, TABLOCK );
TABLOCKreduce los conflictos de bloqueo durante las inserciones masivas.
Pregunta: ¿Se puede desactivar y reconstruir índices en cualquier momento para acelerar la inserción masiva, si la tabla está involucrada en transacciones?
Respuesta: No, si la tabla participa en transacciones activas, desactivar o reconstruir índices puede causar bloqueos, violaciones de la integridad de los datos o incluso pérdida de datos si la transacción se revierte. Esta operación debe realizarse solo fuera de las transacciones o planificar ventanas de mantenimiento con antelación.
-- Incorrecto: BEGIN TRAN; ALTER INDEX ALL ON my_table DISABLE; -- ... bulk insert ... ALTER INDEX ALL ON my_table REBUILD; COMMIT;
Esta desactivación no es aceptable dentro de transacciones prolongadas!
Historia 1: En un proyecto, las inserciones masivas paralelas en una tabla con varios índices únicos llevaron a bloqueos frecuentes y una disminución drástica del rendimiento. La solución fue desactivar temporalmente los índices no clave durante el período de importación y reducir el tamaño de las operaciones por lotes.
Historia 2: Los desarrolladores olvidaron desactivar el control de claves externas durante la carga de datos, y cada inserción verificaba la existencia de registros relacionados en otras tablas grandes. Esto aumentó el tiempo de carga de 40 minutos a 9 horas. Después de desactivar las restricciones, la inserción tomó 12 minutos.
Historia 3: Intentar insertar un archivo grande en una sola consulta (sin lotes y sin transacciones) provocó el desbordamiento del registro de transacciones (transaction log full) y el cierre forzado del servidor de base de datos. Después de pasar al procesamiento por lotes, el problema desapareció.