Hallo,
ich habe eine Hibernate-Anwendung in der sehr viele Datensätze regelmäßig in eine Tabelle geschrieben werden. Man kann sich diese Tabelle als Log-Tabelle vorstellen, wo z.B. jede vom Benutzer ausgeführte Aktion festgehalten wird.
Diese Tabelle wird nach einem Jahr ca. 120 Mio Datensätze enthalten und wächst pro Woche um ca. 2,5 Mio Datensätze. Um die Tabelle nicht zu groß werden zu lassen, sollen einmal pro Woche "alte" Datensätze (solche die älter als ein Jahr sind) automatisch gelöscht werden. D.h. es müssen bei jedem Löschvorgang ca. 2,5 Mio Datensätze aus einer 120 Mio Datensätze großen Tabelle gelöscht werden.
Es wäre natürlich möglich diese Operation per Hibernate (HQL) durchzuführen. Ich vermute aber, dass die Laufzeit dieser Operation viel zu lang wäre und somit die Anwendung blockiert (die ja zudem auch noch sekündlich versucht in die gleiche Tabelle zu schreiben).
Ich bin also auf der Suche nach dem performantesten Weg dieses Löschen durchzuführen.
Als Alternative ist mir bisher eine Stored Procedure eingefallen, aber ist die dann wirklich schneller? Außerdem habe ich in der Hibernate Dokumentation gelesen, dass man Stored Procedures nicht mit setMaxResults() beschränken kann. Ich denke aber, dass es nötig sein wird, die Löschoperation in mehr als eine Transaktion aufzuteilen, weil die Transaktion sonst erstens sehr lange dauert (und für diese Zeit die Tabelle ggf. gelockt wird, wenn das ROW-Locking nicht ausreicht) und zweitens das Transaktions-Log der DB (DB2) zu klein sein könnte.
Hat jemand eine gute Idee wie so etwas zu lösen ist?
ich habe eine Hibernate-Anwendung in der sehr viele Datensätze regelmäßig in eine Tabelle geschrieben werden. Man kann sich diese Tabelle als Log-Tabelle vorstellen, wo z.B. jede vom Benutzer ausgeführte Aktion festgehalten wird.
Diese Tabelle wird nach einem Jahr ca. 120 Mio Datensätze enthalten und wächst pro Woche um ca. 2,5 Mio Datensätze. Um die Tabelle nicht zu groß werden zu lassen, sollen einmal pro Woche "alte" Datensätze (solche die älter als ein Jahr sind) automatisch gelöscht werden. D.h. es müssen bei jedem Löschvorgang ca. 2,5 Mio Datensätze aus einer 120 Mio Datensätze großen Tabelle gelöscht werden.
Es wäre natürlich möglich diese Operation per Hibernate (HQL) durchzuführen. Ich vermute aber, dass die Laufzeit dieser Operation viel zu lang wäre und somit die Anwendung blockiert (die ja zudem auch noch sekündlich versucht in die gleiche Tabelle zu schreiben).
Ich bin also auf der Suche nach dem performantesten Weg dieses Löschen durchzuführen.
Als Alternative ist mir bisher eine Stored Procedure eingefallen, aber ist die dann wirklich schneller? Außerdem habe ich in der Hibernate Dokumentation gelesen, dass man Stored Procedures nicht mit setMaxResults() beschränken kann. Ich denke aber, dass es nötig sein wird, die Löschoperation in mehr als eine Transaktion aufzuteilen, weil die Transaktion sonst erstens sehr lange dauert (und für diese Zeit die Tabelle ggf. gelockt wird, wenn das ROW-Locking nicht ausreicht) und zweitens das Transaktions-Log der DB (DB2) zu klein sein könnte.
Hat jemand eine gute Idee wie so etwas zu lösen ist?