2009-08-17 8 views
2

Ich habe ein Stück Code, der ungefähr 500.000 Einsätze in einer Datenbank ausführt. Es wird nun in einer Schleife ausgeführt, die das executeUpdate von PreparedStatement bei jeder Iteration aufruft. Wäre es schneller, alle 500.000 Einsätze zu einem Stapel hinzuzufügen und executeBatch nur einmal aufzurufen?Wann ist es schneller, Batch-Operationen auf JDBC zu verwenden?

+1

Was bedeutet "besser"? Einfacher? Schneller? Einfacher zu pflegen? Weniger Netzwerknutzung? Leichteres Zurücksetzen im Falle eines Problems? –

+1

@ S.Lott: Es ist ziemlich sicher anzunehmen, dass "besser" in 99% der Fragen zu SQL "schneller" bedeutet. –

+0

@ Bill Karwin: Interessante Beobachtung. Wie kannst du das Wissen? Stimmt es für diese Frage? Wie kannst du das Wissen*? –

Antwort

3

Ja, es wird viel schneller sein. stellen Sie sicher, dass Sie AutoCommit zuerst ausschalten, sonst erhalten Sie keinen Leistungsvorteil.

4

Mit PreparedStatement in Kombination mit Batch-Update-Anlage Ausbeuten effizientesten Ergebnisse (von Sun JDBC doc):

// turn off autocommit 
con.setAutoCommit(false); 

PreparedStatement stmt = con.prepareStatement(
    "INSERT INTO employees VALUES (?, ?)"); 

stmt.setInt(1, 2000); 
stmt.setString(2, "Kelly Kaufmann"); 
stmt.addBatch(); 

stmt.setInt(1, 3000); 
stmt.setString(2, "Bill Barnes"); 
stmt.addBatch(); 

// submit the batch for execution 
int[] updateCounts = stmt.executeBatch(); 
1

500,000 ist viel zu viel auf einmal hinzuzufügen. Denken Sie daran, diese Aufzeichnungen werden im Speicher gehalten und sofort gesendet. Fügen Sie sie in Chargen von ein paar tausend hinzu, bemerkte ich keine Verbesserung zwischen 1000 und 10000 Zeilen in einem Batch (mit MySQL), aber ich vermute einige andere Faktoren zählt.

+0

könnte es für kleines Beispiel mit vorbereiteter Aussage durchaus durchführbar sein. aber es hängt wirklich davon ab, ich stimme zu ... – topchef

Verwandte Themen