2017-07-16 11 views
0

Ich benutze Sybase ASE 15.5 und JDBC-Treiber jconnect 4 und ich bin langsam einfügen mit executebatch() mit einer Batch-Größe von +/- 40 Zeilen auf einem großen Tabelle von 400 Millionen Zeilen mit Spalten (Ganzzahl, varchar (128), varchar (255)), Primärschlüssel und Clustered-Index für Spalten (1,2) und Nonclustered-Index für Spalten (2,1). Jede Charge von +/- 40 Zeilen dauert +/- 200 ms. Bezieht sich die Langsamkeit auf die Größe des Tisches? Ich weiß, dass das Löschen der Indizes die Leistung verbessern kann, aber das ist leider keine Option. Wie kann ich die Einführgeschwindigkeit verbessern?Sybase ASE 15.5: Langsame Einfügung mit JDBC execedatch()

HINWEIS: Dies ist Teil der Anwendung Live-Lauf, das ist keine One-Shot-Migration, also werde ich nicht BCP-Tool verwenden.

EDIT: Ich habe diese Antwort für mysql überprüft, aber nicht sicher, es gilt für Sybase ASE https://stackoverflow.com/a/13504946/8315843

+0

Ich bin mir nicht sicher, was Sie mit "+/- 40 Zeilen" und "+/- 200 ms" meinen (ich würde normalerweise einen Bereich von 80 Zeilen und einen Bereich von 400 ms annehmen ... ??); Oder sagst du, dass es 200ms dauert, 40 Zeilen einzufügen? – markp

+0

200ms für 40 Zeilen, wenn ich mich nicht irre. Ich werde das nochmal überprüfen. – Sybuser

+0

Es dauert 240 ms, aber es wird nichts eingefügt. Ich habe eine neue Frage https://stackoverflow.com/q/45150506/8315843 – Sybuser

Antwort

2

Es gibt viele Gründe, warum die Einsätze langsam sein könnten, zB:

  • jeder Einsatz-Anweisung mit geparst/kompiliert werden; die ASE 15.x Optimierer versucht, eine Menge mehr Arbeit als der vorherige ASE 11/12 Optimierer w/Netto-Ergebnis zu tun, dass kompiliert (in der Regel) dauert länger
  • der Stapel ist nicht in einer einzigen Transaktion verpackt, so dass jeder Einsatz hat für ein separates schreiben in das Protokoll warten
  • Sie abgeschlossen haben eine langsame Netzwerkverbindung zwischen der Client-Host und dem dataserver- Host bekommen
  • einig Blockierung auf
  • der Tisch geht es hat FK Einschränkungen, die sein müssen überprüft für jeden Einsatz
  • Es gibt einen Insert-Trigger auf dem Tisch (mit der offensichtlichen Frage o f, was ist der Auslöser tun und wie lange dauert es, seine Operationen auszuführen)

Einige Ideen re zu berücksichtigen: die Einsätze zu beschleunigen:

  • Verwendung Aussagen vorbereitet; die erste Einfügung wird in eine leichtgewichtige Prozedur kompiliert (denke 'Temp-Prozedur'); Folgebeispiele (unter Verwendung der vorbereiteten Anweisung) profitieren davon, dass sie nicht kompiliert werden müssen
  • Stellen Sie sicher, dass eine Charge von Beilagen in einer begin/commit tran Verpackung verpackt ist; dies tendiert dazu, die Protokollschreibvorgänge zu verzögern, bis die commit tran ausgegeben wird; weniger Schreibvorgänge in das Protokoll bedeutet weniger Zeit Warten auf die Protokoll schreiben Quittieren
  • Wenn Sie eine (relativ) langsame Netzwerkverbindung zwischen der Anwendung und Dataserver Hosts haben, schauen Sie sich mit einer größeren Paketgröße; weniger Pakete bedeutet weniger Zeit Warten auf Round-Trip-Paketverarbeitung/Warten
  • schauen, ob/wie jdbc die Bulk-Copy-Bibliotheken unterstützt (im Grunde implementieren bcp-ähnliches Verhalten über jdbc) [Ich arbeite nicht mit jdbc, also ich ' m erraten nur diese avaialble sein könnte]

Einige der oben in diesen SO Fäden bedeckt ist:

Getting ExecuteBatch to execute faster

JDBC Delete & Insert using batch

Efficient way to do batch INSERTS with JDBC

+0

Jede Charge von +/- 40 Zeilen ist Teil einer Transaktion, also ist es +/- 40 addBatch() + 1 commit – Sybuser

+0

Bereits vorbereitete Anweisungen verwenden. Keine Fremdschlüssel, keine Trigger, keine blockierenden Abfragen. – Sybuser

+0

Verwenden Sie die Option "ENABLE_BULK_LOAD" in der Verbindung? Schauen Sie sich das an [Beispiel] (https://stackoverflow.com/questions/2112395/sybase-jconnect-enable-bulk-load-usage) –

Verwandte Themen