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?
Antwort
Ja, es wird viel schneller sein. stellen Sie sicher, dass Sie AutoCommit zuerst ausschalten, sonst erhalten Sie keinen Leistungsvorteil.
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();
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.
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
- 1. Wann ist es angebracht, NOLOCK zu verwenden?
- 2. Wann ist es sicher, .toString() zu verwenden?
- 3. Wann ist es gut, FTP zu verwenden?
- 4. Was ist schneller: JDBC oder JNDI?
- 5. Wann ist Hibernate/JPA/Toplink zu verwenden?
- 6. Wann ist VK_IMAGE_LAYOUT_GENERAL zu verwenden?
- 7. Wann ist Q_NULLPTR zu verwenden?
- 8. Wann AzureQueueSink zu verwenden ist
- 9. Wann ist ccache zu verwenden?
- 10. Wann ist es akzeptabel, ein FRAMESET zu verwenden
- 11. Wann ist es angebracht, das KnownType-Attribut zu verwenden?
- 12. Wann ist es nicht angemessen, abgeleitete Tabellen zu verwenden?
- 13. Wann ist es gut, verschachtelte Funktionen in Python zu verwenden?
- 14. Wann ist es sinnvoll, eine Karte zu verwenden?
- 15. Wann ist es gut Embedded Skriptsprache wie Lua zu verwenden
- 16. SignInManager, was ist es und wie, wann zu verwenden?
- 17. Android: Wann ist es angebracht, FragmentTransaction.remove zu verwenden?
- 18. Wann ist es praktisch, einen Parsergenerator zu verwenden?
- 19. Wann ist es angebracht, "delete this" zu verwenden?
- 20. Wann ist es sinnvoll synchrone Ajax zu verwenden?
- 21. Was ist kein Bereich Bean und wann es zu verwenden?
- 22. Wann genau ist es lecksicher, (anonyme) innere Klassen zu verwenden?
- 23. Wann ist es semantisch korrekt, das hr-Element zu verwenden?
- 24. Wann ist es angebracht, gespeicherte Procs gegen Tabellenwerte zu verwenden?
- 25. Wann ist es angebracht, Django-Kontextprozessoren zu verwenden?
- 26. Wann ist es angemessen, eine TrieMap zu verwenden?
- 27. Es ist möglich, SpeechRecognizer schneller zu machen?
- 28. Wann ist die richtige Ionenscheibe zu verwenden?
- 29. Wann ist es sinnvoll, MVVM zu verlassen?
- 30. In .NET ist es schneller, das Attribut Suffix zu verwenden, obwohl es nicht erforderlich ist?
Was bedeutet "besser"? Einfacher? Schneller? Einfacher zu pflegen? Weniger Netzwerknutzung? Leichteres Zurücksetzen im Falle eines Problems? –
@ S.Lott: Es ist ziemlich sicher anzunehmen, dass "besser" in 99% der Fragen zu SQL "schneller" bedeutet. –
@ Bill Karwin: Interessante Beobachtung. Wie kannst du das Wissen? Stimmt es für diese Frage? Wie kannst du das Wissen*? –