L'elaborazione di grandi volumi di dati in SQL richiede un approccio particolare per prevenire il sovraccarico di memoria, i blocchi e garantire prestazioni stabili. Uno dei principali approcci è suddividere le operazioni in batch: i dati in ingresso vengono elaborati in piccole porzioni, riducendo il carico sul server e consentendo un migliore controllo delle transazioni e dei rollback in caso di errori.
Aspetti chiave:
ROWCOUNT o LIMIT / TOP)COMMIT, per alleggerire il log delle transazioniEsempio (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
Come eliminare 100 milioni di record da una grande tabella con un impatto minimo sulle prestazioni?
Risposta errata: "Fare un grande DELETE".
Risposta corretta: Eliminare in porzioni (batch) controllando la dimensione del batch, fare COMMIT dopo ogni blocco, se necessario ridurre il carico sul disco e i blocchi utilizzando pause (WAITFOR DELAY o simili).
Esempio (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$$;
Storia
Progetto: Servizio bancario ad alta intensità di carico. Errore: Lo sviluppatore ha avviato l'eliminazione dei log obsoleti con un'unica grande query su 80 milioni di righe. Risultato — il log delle transazioni è cresciuto fino a terabyte, esaurendo tutto lo spazio disco disponibile, il servizio è "crollato".
Storia
Progetto: Negozio online con sistema di gestione del magazzino. Errore: Durante l'inserimento di massa non è stato limitato la dimensione della transazione. Durante l'importazione di batch massivi, si sono verificati errori nelle registrazioni, tutto il lavoro precedente ha dovuto essere annullato e ripetuto, richiedendo ore invece di minuti.
Storia
Progetto: Rivenditore, database di reportistica sui dettagli degli ordini. Errore: Sono stati utilizzati batch, ma si è dimenticato il COMMIT tra le iterazioni — il log delle transazioni è cresciuto esponenzialmente, il server ha iniziato a "rallentare", e successivamente è stato necessario un intervento di pulizia urgente dei log con strumenti standard.