Die Verarbeitung großer Datenmengen in SQL erfordert einen speziellen Ansatz, um Speicherüberläufe, Sperren zu vermeiden und eine stabile Leistung sicherzustellen. Eine der Hauptmethoden ist die Aufteilung der Operationen in Batches: Eingabedaten werden in kleinen Portionen verarbeitet, was die Belastung des Servers verringert und eine bessere Kontrolle über Transaktionen und Rückrollungen im Fehlerfall ermöglicht.
Schlüssel Aspekte:
ROWCOUNT oder LIMIT / TOP)COMMIT, um das Transaktionsprotokoll zu entlastenBeispiel (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
Wie entfernt man 100 Millionen Einträge aus einer großen Tabelle mit minimalem Einfluss auf die Leistung?
Falsche Antwort: "Ein großes DELETE ausführen".
Richtige Antwort: In Portionen (Batches) mit Kontrolle der Batch-Größe löschen, nach jedem Block COMMIT durchführen, wenn nötig die Belastung der Festplatte und Sperren durch Pausen (WAITFOR DELAY oder ähnliches) reduzieren.
Beispiel (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$$;
Geschichte
Projekt: Hochbelasteter Bankdienst. Fehler: Ein Entwickler führte das Löschen veralteter Protokolle mit einer einzigen großen Abfrage für 80 Millionen Zeilen durch. Ergebnis — das Transaktionsprotokoll wuchs auf Terabytes, der gesamte verfügbare Speicherplatz wurde überschritten, der Dienst "fiel" aus.
Geschichte
Projekt: Online-Shop mit einem Lagerverwaltungssystem. Fehler: Bei der massenhaften Einspeisung wurde die Transaktionsgröße nicht eingeschränkt. Während des Imports massiver Batches traten Fehler auf, und die gesamte vorherige Arbeit musste zurückgerollt und wiederholt werden, was Stunden statt Minuten in Anspruch nahm.
Geschichte
Projekt: Einzelhändler, Reporting-Datenbank zur Detailierung von Bestellungen. Fehler: Batch-Verarbeitung wurde verwendet, aber COMMIT zwischen den Iterationen vergessen — das Transaktionsprotokoll wuchs exponentiell, der Server begann zu "verzögern", und dann war eine dringende Protokollbereinigung mit Standardmitteln erforderlich.