Bulkgegevensinvoegen (bulk insert) is een typische taak bij migratie, import of aanvulling van grote tabellen. De efficiëntie van deze operatie hangt van verschillende factoren af:
BULK INSERT of COPY (PostgreSQL) - ze werken sneller dan gewone INSERT in een lus.BULK INSERT my_table FROM 'C:\data\bulkdata.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = ' ', BATCHSIZE = 5000, TABLOCK );
TABLOCKvermindert lockingconflicten bij bulk-invoegen.
Vraag: Is het mogelijk om op elk moment indexen uit te schakelen en opnieuw te creëren om bulk-invoegen te versnellen, als de tabel betrokken is bij transacties?
Antwoord: Nee, als de tabel betrokken is bij actieve transacties, kan het uitschakelen of opnieuw creëren van indexen leiden tot locking, schending van gegevensintegriteit of zelfs gegevensverlies als de transactie teruggedraaid wordt. Deze operatie moet alleen buiten transacties worden uitgevoerd, of van tevoren onderhoudsvensters gepland worden.
-- Onjuist: BEGIN TRAN; ALTER INDEX ALL ON my_table DISABLE; -- ... bulk insert ... ALTER INDEX ALL ON my_table REBUILD; COMMIT;
Het uitschakelen binnen lange transacties is onacceptabel!
Verhaal 1: In een project leidde parallelle bulk-invoegen in een tabel met meerdere unieke indexen tot frequente deadlocks en een scherpe daling van de prestaties. De oplossing was tijdelijk het uitschakelen van niet-sleutelindexen tijdens de importperiode en het verkleinen van de batchgrootte.
Verhaal 2: Ontwikkelaars vergaten de controle van externe sleutels uit te schakelen tijdens de gegevensinvoer, en elke invoeging controleerde de aanwezigheid van gerelateerde records in andere grote tabellen. Dit verhoogde de laadtijd van 40 minuten tot 9 uur. Na het uitschakelen van de constraints nam de invoeging 12 minuten in beslag.
Verhaal 3: Poging om een groot bestand in één enkele aanvraag in te voegen (zonder batching en zonder transacties) leidde tot een vol transactie-logboek (transaction log full) en noodstop van de database server. Na overstap naar batchverwerking verdween het probleem.