MySQL Prepared Statement batch langsamer als bulk insert?

Laures

Mitglied
Hallo,

ich vergleiche gerade mehrere methoden viele zeilen in eine tabelle einzufügen.

Zuerst ist das das bisher im code (nicht meiner^^) verwendete Verfahren, ein laaaanges insert query mit vielen einträgen zu basteln.

Java:
StringBuffer insertStart, insert = new StringBuffer();
String insertValues;
insertStart = new StringBuffer("INSERT INTO " + tn + "(id, ts, uid, eid) VALUES");
insert.append(insertStart);
stmt = c.createStatement();
stmt = c.createStatement();
for(uid = 1; uid <= COUNT; uid++) {
	id = uid - COUNT;
	insertValues = "(" + id + ", '" + new Timestamp(System.currentTimeMillis()) + "', " + uid + ", " + 42 + ")";
	insert.append(insertValues);
	if(uid % BATCH == 0 || uid == COUNT) {
		stmt.execute(insert.toString());
		insert = new StringBuffer(insertStart);
	} else {
		insert.append(", ");
	}
}

Dann die methode über Prepared statements:
Java:
String sql = "INSERT INTO " + tn + "(id, ts, uid, eid) VALUES (?, ?, ?, ?)";
stmt = c.prepareStatement(sql);
for(uid = 1; uid <= COUNT; uid++) {
	id = uid - COUNT;
	stmt.setInt(1, id);
	stmt.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
	stmt.setInt(3, uid);
	stmt.setInt(4, 35);
	stmt.addBatch();
	if(uid % BATCH == 0 || uid == COUNT) {
		stmt.executeBatch();
		stmt.clearBatch();
	}
}

Vergleiche ich nun die Zeit, die beide methoden brauchen um 100 000 Zeilen in 1000er Paketen hinzuzufügen ist die prepared statement methode um üetwa 40% langsamer. Es will mir nicht ganz in den kopf das die saubere Art das zu machen so viel langsamer ist.

Was mache ich falsch.

Laures
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ist relativ einfach - im ersten Fall wird genau ein Commando an die Datenbank geschickt im zweiten Fall eine Menge von Commandos.

Soweit ich weiß ist glaube ich auch Lösung 1 ein Sonderfall von MySQL, das geht soweit ich weiß nicht bei jedem RDBMS. Ich würde auf jeden Fall Lösung 2 bevorzugen - da kann man dann wenigstens auch vernünftig Fehler aufarbeiten. Und über weiter Vorteile wie die Typensicherheit und Sicherheit gegen SQL Injections brauch man nun nicht weiter reden.
 

Laures

Mitglied
das heißt obwohl die statement batches genausoviele inserts enthalten wie ein bulk insert statement, sind sie langsamer weil es im batch mehrere querys sind?
 
M

maki

Gast
Ist relativ einfach - im ersten Fall wird genau ein Commando an die Datenbank geschickt im zweiten Fall eine Menge von Commandos.
Sorry, ist aber nicht richtig.

"Commandos zur Datenbank" schicken dauert an sich sehr lange, weil das Netzwerk involviert ist.
NOrmalerweise sind Bulkstatement gleich um Größenordnungen schneller als ihre einzelnen Pendants, vorrausgesetzt, man hat die richtige Batch- und Transaktionsgröße gefunden, hängt immer von der DB Konfiguration ab.

Laures,

würde mal versuchen nicht 1000 Statements aufeinmal zu schicken, spiel doch mal ein bisschen mit der Batchgröße herum.
Bei Transaktionen wird oft eine temp. Tabelle verwendet, wenn es zuviele Transaktionen werden, kann das bremsen.
 

Laures

Mitglied
ich hab jetz mal bissel mit der batch size rumprobiert und alle debug outputs rausgenommen.

bulk insert immer etwa 9-10 mal so schnell wie die prepared statement batch.
die "optimale" bulk größe scheint bei ca 2000 zu liegen.

die prepared statements brauche (relativ unabhängig von der bulk größe immer etwa 10,xx sekunden.

scheinbar ist die häßliche methode die deutlich schnellere.
 
G

Gast2

Gast
Sorry, ist aber nicht richtig.

"Commandos zur Datenbank" schicken dauert an sich sehr lange, weil das Netzwerk involviert ist.
NOrmalerweise sind Bulkstatement gleich um Größenordnungen schneller als ihre einzelnen Pendants, vorrausgesetzt, man hat die richtige Batch- und Transaktionsgröße gefunden, hängt immer von der DB Konfiguration ab.

Ich habe doch nichts anderes geschrieben? Das MySQL Bulk Insert ist genau ein Statement das komplett an die DB geschickt wird und dann intern auseinander genommen wird. PreparedStatements (auch als Batch) werden afaik einzeln hintereinander abgearbeitet (Im Treiber gequeued, nicht in der DB) und brauchen deswegen grundsätzlich länger.
 

Laures

Mitglied
beim ersten versuch hatte ich debug ausgaben drinn. die haben dem bulk insert wohl deutlich mehr geschadet als den prepared statements. Jedenfalls lag da das verhältnis bei 6 sekunden gegen 11 sekunden.

ohne dass alles (und mit verschiedenen batch größen getestet) braucht ein großes insert etwa eine sekunde, die prepared statements über 10.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JDBC Prepared Statement Autoincrement Datenbankprogrammierung 3
N Update Prepared Statement Fehler bei Argumenten Datenbankprogrammierung 3
C PostgreSQL Prepared Statement Datenbankprogrammierung 7
N Prepared Statement mit unbekannter Anzahl von Where-Clauses Datenbankprogrammierung 30
F Frage zu Prepared Statement Datenbankprogrammierung 2
D Problem: Prepared Statement (Insert) funktioniert nicht. Datenbankprogrammierung 3
G Mit Prepared Statement in MDB schreiben Datenbankprogrammierung 7
W Prepared Statement und Verbindungsverlust Datenbankprogrammierung 4
W Prepared Statement mehrere Zeichenketten Datenbankprogrammierung 4
G Keine Aussicht mit Prepared Statement Datenbankprogrammierung 10
P Prepared Statement scheint nicht zu funktionieren Datenbankprogrammierung 14
N Prepared Statement Datenbankprogrammierung 8
T Prepared Statements und Sets Datenbankprogrammierung 5
L Wiederverwendung von Prepared Statements Datenbankprogrammierung 4
Landei Mehre Werte für einen Prepared-Statement_Parameter übergeben? Datenbankprogrammierung 3
N prepared Statements Datenbankprogrammierung 6
G Flexible Prepared Statements Datenbankprogrammierung 2
F Update mit Prepared Statements Datenbankprogrammierung 10
D Statement läuft ewig Datenbankprogrammierung 14
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
Kotelettklopfer SQLite Verhindern von doppelter Statement Ausführung Datenbankprogrammierung 25
L SQL-Statement SQL Statement doppelte Einträge finden Datenbankprogrammierung 9
C MySQL SQL Statement wir nicht ausgeführt Datenbankprogrammierung 11
G Datenbank Statement Datenbankprogrammierung 22
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
B MySQL Umkreissuche - brauche Hilfe bei SQL Statement Datenbankprogrammierung 12
M CSV Import - Dynamisches SQL Statement Datenbankprogrammierung 15
D Wiederverwendung / Recycling / Queuing von Statement Objekten Datenbankprogrammierung 1
D SQL Statement gesucht... Datenbankprogrammierung 15
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
F Dynamischen String in SQL Statement einbinden Datenbankprogrammierung 9
L SQL Statement mit Switch-Case funktioniert nicht Datenbankprogrammierung 6
U PostgreSQL SELECT Statement Datenbankprogrammierung 5
A Problem mit Create-Statement Datenbankprogrammierung 9
LadyMilka MySQL Syntaxfehler im Statement Datenbankprogrammierung 3
P SQL-Statement Bei meinem Statement ist ein Fehler? Datenbankprogrammierung 2
P sql statement alter table foreign key Datenbankprogrammierung 4
T sql Statement Datenbankprogrammierung 9
B JDBC MySQL Statement Datenbankprogrammierung 3
A Sql Statement - Alle Zahlen größer 9 Datenbankprogrammierung 3
F Sql Statement Datenbankprogrammierung 12
A SQL-Statement prüfen Datenbankprogrammierung 3
W Statement als Klassenvariable Datenbankprogrammierung 27
I Select-Statement optimieren Datenbankprogrammierung 14
D SQLite Statement nimmt keine Namen aus getter-Methoden Datenbankprogrammierung 11
alex_fairytail MySQL SQL Statement Delete zwischen Datum1 und Datum2 Datenbankprogrammierung 5
M Access Update Statement Fehler update -> unmöglich? Datenbankprogrammierung 3
R Derby/JavaDB LIKE Statement mit Wildcard Datenbankprogrammierung 20
R Select Statement als temporärer Table Datenbankprogrammierung 7
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
R Derby/JavaDB Select TOP Statement geht nicht Datenbankprogrammierung 3
S Null Pointer exception statement Datenbankprogrammierung 8
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
K statement.execute liefert false Datenbankprogrammierung 6
S SQL Statement: executeUpdate Datenbankprogrammierung 15
F wie funktioniert if Statement in SELECT? Datenbankprogrammierung 2
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
M MySQL größere von zwei Zahlen in Update Statement Datenbankprogrammierung 2
J [Hibernate] Select Statement Datenbankprogrammierung 4
S HSQLDB DELETE-Statement funktioniert nicht Datenbankprogrammierung 4
L MySQL Kann Statement nicht erzeugen Datenbankprogrammierung 5
T Komme mit dem SQL Statement nicht weiter Datenbankprogrammierung 5
D MySQL Client - Server: Client verabschiedet sich sobald ich Variablen im SQL Statement verwende Datenbankprogrammierung 9
T java.sql.SQLException: unexpected end of statement Datenbankprogrammierung 2
J SQL-Statement Datenbankprogrammierung 10
U MSSQL Verbindung steht, aber meckert beim Statement Datenbankprogrammierung 2
S executeBatch result immet mit Statement.SUCCESS_NO_INFO Datenbankprogrammierung 4
G Frage zum Insert-Statement Datenbankprogrammierung 2
J JDBC- Statement Ausführung nicht persistent Datenbankprogrammierung 2
A Connection Variable in anderer Klasse verwenden -> statement Datenbankprogrammierung 2
Z DELETE-Statement Datenbankprogrammierung 6
G INSERT-STATEMENT Datenbankprogrammierung 6
alexpetri hsql statement problem Datenbankprogrammierung 3
W invalid sql statement ? Datenbankprogrammierung 3
S Probleme mit statement.close() Datenbankprogrammierung 10
G Wie ein SQL-Statement zusammensetzen? Datenbankprogrammierung 5
T Select Statement auf Relation Datenbankprogrammierung 3
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
G MsSQL | Statement.execute(String s) Datenbankprogrammierung 3
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
C Statement/Connection SQLWarning Datenbankprogrammierung 4
J sql-statement Datenbankprogrammierung 7
G Update Statement automatisch unterteilen lassen Datenbankprogrammierung 3
T SQL-Statement parser? Datenbankprogrammierung 11
G Problem mit Suchen Statement Java und MS-SQL-Server Datenbankprogrammierung 9
J SELECT-Statement Datenbankprogrammierung 4
S Statement.getGeneratedKeys() funktioniert nicht Datenbankprogrammierung 4
G Problem mit Delete-Statement Datenbankprogrammierung 3
L mehrere Abfragen mit einem Statement!? Datenbankprogrammierung 5
E Problem mit create-Statement Datenbankprogrammierung 5
E SQL-Statement um eine Nummer in der Datenbank zu suchen Datenbankprogrammierung 3
B DB Update via batch Datenbankprogrammierung 3
N batch-Update wird nicht durchgeführt Datenbankprogrammierung 2
P PreparedStatement batch und getGeneratedKeys Datenbankprogrammierung 7
H Batch Update/Insert Datenbankprogrammierung 4
H Wie viele SQL-Statements gehen in ein Batch Datenbankprogrammierung 2
M mysql jdbc batch files ausführen. Datenbankprogrammierung 3
T [jdbc] einen Eintrag aus mehreren Tabellen löschen (Batch) Datenbankprogrammierung 3

Ähnliche Java Themen


Oben