L'emergere di grandi magazzini e flussi di dati (ETL, migrazioni) richiedeva non solo di caricare centinaia di migliaia di righe, ma anche di garantire che i dati venissero caricati completamente o non venisse caricato nulla. In SQL questo viene realizzato tramite operazioni bulk atomiche utilizzando transazioni.
Durante un'inserzione massiva (Bulk Insert) il rischio di errore è più alto: una riga non corretta può rovinare l'intero caricamento o portare a un'inserzione parziale. Questo è inaccettabile per sistemi finanziari, logistici e altri sistemi critici.
È prassi avvolgere l'operazione bulk in una transazione, utilizzare comandi speciali appropriati (BULK INSERT, COPY) e catturare/registrare errori. È importante: in caso di errore su qualsiasi riga, l'intero blocco viene annullato:
Esempio per SQL Server:
BEGIN TRAN; BULK INSERT Customers FROM 'C:\data\customers.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = ' ', FIRSTROW = 2 ); IF @@ERROR <> 0 ROLLBACK TRAN; ELSE COMMIT TRAN;
In PostgreSQL (esempio con COPY):
BEGIN; COPY products FROM '/tmp/products.csv' DELIMITER ',' CSV HEADER; COMMIT;
Caratteristiche chiave:
Influisce la dimensione della transazione durante il Bulk Insert sulle prestazioni e sui blocchi?
Sì, con volumi troppo grandi si può ottenere un lungo blocco, sovraccaricare i log delle transazioni e rallentare il server. La cosa migliore è caricare a porzioni (batch), ad esempio 10.000 righe per transazione.
Il Bulk Insert è sempre transazionale per impostazione predefinita in tutti i DBMS?
No, in alcuni DBMS (ad esempio, MySQL) il comando bulk insert non è sempre automaticamente atomico: è necessario racchiuderlo in BEGIN/COMMIT manualmente, altrimenti è possibile un'inserzione parziale.
È possibile garantire l'integrità delle chiavi esterne durante un'inserzione massiva?
Sì, solo se viene rispettato l'ordine di caricamento: prima le tabelle genitore, poi quelle figlio, oppure disabilitare temporaneamente i vincoli. Un errore di chiave esterna annullerà l'intera transazione bulk insert.
Durante il caricamento dei clienti, un file con un errore in una riga ha portato a un caricamento parziale: alla fine della giornata, il database e la fonte esterna sono diventati desincronizzati.
Vantaggi:
Un file è stato controllato in anticipo per errori, il Bulk insert è stato suddiviso in porzioni da 5.000 righe, ciascuna in una propria transazione. I registri degli errori sono stati salvati per ulteriori analisi.
Vantaggi: