Löschen vieler Datensätze mit Hibernate

Olel

Mitglied
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?
 

homer65

Top Contributor
Einfach die Datensätze mit einem Timestamp versehen. Dann kann man das löschen mit einem einzigen SQL Befehl ausführen:
delete from logtable where datum < ...
 

Olel

Mitglied
Einfach die Datensätze mit einem Timestamp versehen. Dann kann man das löschen mit einem einzigen SQL Befehl ausführen:

Die Datensätze haben bereits einen Timestamp und das Delete-Statement sieht genauso aus. Bei 2,5 Mio Datensätzen dauert dieses Delete aber dennoch sehr lange oder kann ggf. gar nicht durchgeführt werden, da das Transaktion-Log für das Löschen so einer großen Datenmenge sehr groß wird und dessen Schreiben recht langsam ist.

Deswegen die Idee die Operation in mehrere Transaktionen aufzusplitten.
 
S

SlaterB

Gast
wenn du die Objekte nicht lädst sondern per SQL löschst (einmalige Umwandlung HQL in SQL stört auch nicht),
dann ist Hibernate gar nicht beteiligt, falls du das als Langsamkeit in der Diskussion ansiehst?

teste mit einem separaten DB-Tool, geht es dort schneller?
ob Timestamp gut verwendet werden kann liegt doch bestimmt an Indexen, aber das braucht man wohl gar nicht mehr erst ansprechen?

falls das mit dem Löschen fest ist, könnte zur Vereinfachung vielleicht auch auf Timestamp verzichtet werden und eine zusätzliche Spalte mit einer einfachen Zahl, Kalenderwoche 1-5x oder ähnliches gefüllt werden?
die Extremvariante wären 5x einzelne Tabellen..

> Deswegen die Idee die Operation in mehrere Transaktionen aufzusplitten.
ganz einfach testen ob 5x 500.000 oder 25x 100.000, so gut man das hinbekommt,
schneller, langsamer oder gleich sind?
 
Zuletzt bearbeitet von einem Moderator:

Olel

Mitglied
wenn du die Objekte nicht lädst sondern per SQL löschst (einmalige Umwandlung HQL in SQL stört auch nicht),
dann ist Hibernate gar nicht beteiligt, falls du das als Langsamkeit in der Diskussion ansiehst?

Macht Sinn. Ob man Hibernate benutzt ist an dieser Stelle wohl egal.

teste mit einem separaten DB-Tool, geht es dort schneller?
ob Timestamp gut verwendet werden kann liegt doch bestimmt an Indexen, aber das braucht man wohl gar nicht mehr erst ansprechen?

Nein, geht es nicht. Wenn das Löschen in einer Transaktion erfolgt, ist es einfach langsam. Ein Index ist auf den Timestamp natürlich gesetzt. Es liegt wohl wie gesagt am Transaktionslog. Ich bin aber ehrlich gesagt auch überrascht, dass das wirklich ein Problem darstellt.

ganz einfach testen ob 5x 500.000 oder 25x 100.000, so gut man das hinbekommt,
schneller, langsamer oder gleich sind?
In einem DB-Tool einfach machbar, aber könnte man sowas auch in einer StoredProcedure hinbekommen? Das in Hibernate selbst zu bauen, ist zwar machbar, aber auch nicht ganz ohne Aufwand. Außerdem würde ich in unserer Anwendung gerne bei Transaction by Annotation (via Spring) bleiben und keine eigenen programmatischen Transaktionen verwenden.
 
S

SlaterB

Gast
ich hab zwischendurch editiert, auch wenn vielleicht nicht so wichtig bei Transaktionslog, was immer das ist
falls das mit dem Löschen fest ist, könnte zur Vereinfachung vielleicht auch auf Timestamp verzichtet werden und eine zusätzliche Spalte mit einer einfachen Zahl, Kalenderwoche 1-5x oder ähnliches gefüllt werden?
die Extremvariante wären 5x einzelne Tabellen..

ansonsten kann ich sicher nichts mehr beitragen,
eine Datenbank muss ja wohl löschen können oder eben nicht,
Konfigurationen dort sind nicht mein Gebiet
 

homer65

Top Contributor
Wenn du das auf mehrere Transaktionen aufteilen willst - warum auch immer - kannst du mehrere SQL Statements absetzen:
delete from logtable where datum < x1
delete from logtable where datum < x2
delete from logtable where datum < x3
...
Wobei x1 < x2 < x3 ...
Wenn du die xn geschickt wählst kommen nicht zu große Transaktionen dabei raus.
 
S

SlaterB

Gast
alles zu
- hibernate.jdbc.batch_size 20
- session.flush();
- second_level_cache
- alles von Hibernate allgemein
usw. von der Seite spielt beim Löschen wie hier beschrieben aber keine Rolle oder?
dann etwas merkwürdiger Vorschlag,
oder gibt es doch eine relevante 'Transaktionsgröße' für diese Frage bei Hibernate?
 
N

nillehammer

Gast
Ich hatte ein ähnliches Verhalten beim Löschen sehr vieler Datensätze in einer MySql-DB. Wir haben am Ende mit mehreren Wochenweise aufgeteilten Tabellen gearbeitet und zum Löschen einfach die entspr. Tabelle gedroppt und wieder created. Das war zwar etwas exotisch aber dafür unschlagbar schnell.
 

JanHH

Top Contributor
Ich hatte das Problem auch mal, allerdings gings da nur um 5000 Datensätze, löschen (per SQL) trotzdem langsam. Grund war, dass die per @OneToMany oder @ManyToOne `(oder irgendwas in der Art halt) mit anderen Datensätzen verknüft waren und die Datenbank dann nach dem Löschen jedes Datensatzes erstmal irgendeine andere Tabelle komplett durchsucht hat. Das war die Bremse. Also vielleicht hast Du ja auch solche Verknüpfungen in Deiner Tabelle.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S gesamte Tabelle löschen Datenbankprogrammierung 2
F SQLite Datensatz löschen Datenbankprogrammierung 13
R PostgreSQL JPA - Löschen und orphanRemoval Datenbankprogrammierung 6
B Mit Button einen Datensatz löschen Datenbankprogrammierung 2
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
B Fortlaufende Nummer - Was tun bei löschen? Datenbankprogrammierung 6
R eclipselink - referenzierte Entity löschen Datenbankprogrammierung 0
P Indizes / Fremdschlüssel löschen Datenbankprogrammierung 2
H Oracle Aus Datenbank löschen Datenbankprogrammierung 6
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
A Ausgewählten Jtable Eintrag aus Db löschen Datenbankprogrammierung 9
reibi Derby/JavaDB Derby DB löschen Datenbankprogrammierung 5
P JPA- Entities bleiben nach dem Löschen (unsichtbar?) in der Datenbank Datenbankprogrammierung 6
J Datensätze löschen Datenbankprogrammierung 6
C Hibernate Datensatz löschen Datenbankprogrammierung 2
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
M Datenbankeintrag bleibt nach Löschen in JSP vorhanden Datenbankprogrammierung 8
D Mit Trigger Tupel löschen verhindern Datenbankprogrammierung 3
L MySQL Einträge löschen schlägt fehl Datenbankprogrammierung 2
F hibernate_seqeunce reseten (löschen) Datenbankprogrammierung 2
J MySQL Löschen von Rows mit JDBC Datenbankprogrammierung 9
M HSQLDB 2.0 - wie tmp-Verzeichnis löschen Datenbankprogrammierung 2
turmaline [Hibernate] @OneToOne: Löschen einer referenzierten Instanz Datenbankprogrammierung 2
G Oracle Zeile löschen Datenbankprogrammierung 2
C SQL String zwei Tabellen vergleichen und gleiche Zeile löschen Datenbankprogrammierung 25
Java.getSkill() Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen Datenbankprogrammierung 7
D SQL : Objekte individuell löschen können Datenbankprogrammierung 5
R JPA, Spring, löschen einer Entity Datenbankprogrammierung 2
H MySQL Einträge löschen Datenbankprogrammierung 5
M Datensatz aus Datenbank löschen Datenbankprogrammierung 6
Antoras Zeile aus DB löschen und ID runterzählen Datenbankprogrammierung 8
C Objekte aus Datenbank löschen Datenbankprogrammierung 6
F Löschen einer Zeile Datenbankprogrammierung 4
G Mit Java-Programm Datenbank löschen/neu anlegen Datenbankprogrammierung 5
G Löschen eines Eintrages verbunden mit JList Datenbankprogrammierung 5
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
P Tabellen löschen Datenbankprogrammierung 4
O Size ResultSet betrachtete Zeilen "löschen" Datenbankprogrammierung 5
G MySQL Zeile löschen und gleich Optimieren Datenbankprogrammierung 6
T [jdbc] einen Eintrag aus mehreren Tabellen löschen (Batch) Datenbankprogrammierung 3
G mySQL: kaskadierendes Löschen Datenbankprogrammierung 7
M Datensätze in DataGrip (IntelliJ) Datenbankprogrammierung 1
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
R MySQL Datensätze in Textdokument Datenbankprogrammierung 7
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
R Große Datensätze, kleine Rechte Datenbankprogrammierung 8
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
E primaryKey auslesen - Datensätze abgleichen Datenbankprogrammierung 4
S Häufig vorkommende Datensätze Datenbankprogrammierung 4
Kandum MySQL Anzahl gefundener Datensätze bleibt gleich, auch wenn mehr existieren und ausgegeben werden Datenbankprogrammierung 3
C Hibernate Datensätze finden Datenbankprogrammierung 17
F [SQLite] Mehrere Datensätze einfügen Datenbankprogrammierung 12
S Anzahl Datensätze in db4o Datenbankprogrammierung 2
D Können nur angesehende Datensätze geloggt werden? Datenbankprogrammierung 4
F NUR 3 datensätze auslesen Datenbankprogrammierung 6
F MySQL Nur die Datensätze zurückgeben, in denen ein anderer Preis steht Datenbankprogrammierung 9
B Aktuellen Stand der Datensätze einer Datenbank anzeigen Datenbankprogrammierung 9
J SQL-Abfrage zur löschung doppelter Datensätze Datenbankprogrammierung 7
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J Datensätze aus der Datenbank holen Datenbankprogrammierung 3
S MySQl - Neue Datensätze "on the Fly" verarbeiten Datenbankprogrammierung 8
M Keine doppelten Datensätze einfügen Datenbankprogrammierung 24
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
C Doppelte Datensätze Datenbankprogrammierung 11
T Datensätze effektiv einlesen Datenbankprogrammierung 4
ARadauer viele datensätze. Datenbankprogrammierung 3
I Anzahl unterschiedlicher Datensätze ausgeben Datenbankprogrammierung 2
D mehrere Datensätze in ein Listenfeld Datenbankprogrammierung 2
S 50.000 updates auf 50.000 Datensätze Datenbankprogrammierung 3
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
M Datensätze zählen. Datenbankprogrammierung 6
M JDBC: Viele Datensätze in Tabelle einfügen: Wie? Datenbankprogrammierung 7
C Datensätze variabel hinzufügen Datenbankprogrammierung 4
K Ältere Datensätze archivieren Datenbankprogrammierung 4
C Datensätze in einer JComboBox auflisten Datenbankprogrammierung 2
V Anzahl der Datensätze abfragen Datenbankprogrammierung 9
W Datensätze v. SQL-Datenbank i. JTextFields ausgeben/updaten Datenbankprogrammierung 12
D Anzahl der zurückgelieferten Datensätze Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben