Ich verwalte eine Anwendung mit einem sehr großen Oracle-Datenbank-Backend (fast 1 TB Daten mit mehr als 500 Millionen Zeilen in einer Tabelle). Die Datenbank macht eigentlich gar nichts (keine SProcs, keine Trigger oder so), sie ist nur ein Datenspeicher.
Jeden Monat müssen wir Datensätze aus den beiden Haupttabellen entfernen. Die Kriterien für die Bereinigung variieren und sind eine Kombination aus Zeilenalter und einigen Statusfeldern. In der Regel werden zwischen 10 und 50 Millionen Zeilen pro Monat gelöscht (wir fügen wöchentlich etwa 3-5 Millionen Zeilen über Importe hinzu).
Derzeit müssen wir dies in Stapeln von ungefähr 50.000 Zeilen löschen (dh 50000 löschen, festschreiben, 50000 löschen, festschreiben, wiederholen). Wenn Sie versuchen, den gesamten Stapel auf einmal zu löschen, reagiert die Datenbank etwa eine Stunde lang nicht (abhängig von der Anzahl der Zeilen). Das Löschen der Zeilen in solchen Stapeln ist auf dem System sehr rau und muss in der Regel "zeitlich" über einen Zeitraum von einer Woche erfolgen. Das kontinuierliche Ausführen des Skripts kann zu einer für den Benutzer inakzeptablen Leistungsverschlechterung führen.
Ich glaube, dass diese Art des Stapellöschens auch die Indexleistung beeinträchtigt und andere Auswirkungen hat, die letztendlich zu einer Verschlechterung der Datenbankleistung führen. Es gibt 34 Indizes für nur eine Tabelle, und die Indexdatengröße ist tatsächlich größer als die Daten selbst.
Hier ist das Skript, mit dem einer unserer IT-Mitarbeiter diese Bereinigung durchführt:
BEGIN
LOOP
delete FROM tbl_raw
where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;
exit when SQL%rowcount < 49999;
commit;
END LOOP;
commit;
END;
Diese Datenbank muss zu 99,99999% erweitert sein und wir haben nur ein 2-tägiges Wartungsfenster pro Jahr.
Ich suche nach einer besseren Methode zum Entfernen dieser Datensätze, aber ich habe noch keine gefunden. Irgendwelche Vorschläge?