SQL Insert-Statement optimieren

limoneneis

Cadet 4th Year
Registriert
Okt. 2009
Beiträge
72
Hallo Leute,

ich habe ein Java-Programm geschrieben welches Simulationsdaten erzeugt. Diese möchte ich in eine Datenbank speichern. Dazu baue ich immer eine Query als String auf ... :

Stringbuilder str = new StringBuilder("");

Code:
str.append("insert into Tabelle values(a,b,c,d,e);");
str.append("insert into Tabelle values(a,b,c,d,e);");
str.append("insert into Tabelle values(a,b,c,d,e);");
str.append("insert into Tabelle values(a,b,c,d,e);");
str.append("insert into Tabelle values(a,b,c,d,e);");
...
59 Mal

Dann wird diese Query ausgeführt geführt (Methode selber geschrieben).

verbindung.execute(str.toString())


Da sich diese update in zwei Schleifen befindet wird so ein update ca. 70000 Mal gemacht. Mein Programm endet nach 55 Minuten und das ist mir entschieden zu lang. Ich möchte nicht immer erst solange warten bis ich die Daten auswerten kann.

Gibt es eine Variante wie man insert-stmts sehr schnell ausführen kann, bzw. wie man diese erstmal gescheit sammelt?

Danke
 
INSERT INTO tabelle (col_a, col_b, col_c, col_d) VALUES ((a1,b1,c1,d1),(a2,b2,c2,d2),(a3,b3,c3,d3))
 
Auf dieses Problem bin ich in meiner Bacherlorarbeit gestoßen als ich einen Datenbankserver auslasten wollte. Die Lösung ist aber recht einfach:

insert into Tabelle values (a,b,c,d,e),(a,b,c,d,e),(a,b,c,d,e),(a,b,c,d,e);

Damit sollte das einfügen deutlich schneller gehen.

Edit: Zu spät...
 
Ich gehe jetzt einfach mal davon aus, dass du eine MySQL Datenbank benutzt, dann sollte auch folgendes funktionieren:

Code:
str.append("insert into Tabelle values(a,b,c,d,e),(a,b,c,d,e),(a,b,c,d,e);");

Funktioniert aber auch nur dann, wenn wirklich immer die gleiche Anordnung von Daten eingefügt werden soll. Unter Oracle wäre das aber nicht möglich.

Edit: Auch zu langsam ^^.
 
Falls deine DB obiges nicht unterstützt könntest du ansonsten (batched) Prepared Statements verwenden. Eigentlich würde ich das sogar als erstes versuchen, Performance hängt aber vom Treiber ab.
 
Zuletzt bearbeitet:
Hallo,

ich habe das nun getestet und bin von 55 Minuten runter auf 21 Minuten gekommen, was ich auch recht lange finde, aber wenn man abermillionen von Datensätzen erzeugt ist das wohl so...

gruß

EDIT: Ich baue meinen Query-String immer nur bis zu 300 Tupel auf. Eine Schleife höher wären es dann 375000 Tupel. Ich denke da ist dann auch Schluss bei eineme String, oder?
 
Zuletzt bearbeitet:
Hallo limoneneis,

Am schnellsten dürfte es funktionieren,
wenn die Daten zunächst in eine Flatfile (z.B. csv-Textdatei) gespeichert
und erst dann ein einem Rutsch per "Bulk-Insert bzw. LOAD DATA INFILE" in die Datenbank importiert werden. :)

yxcv
 
Zurück
Oben