Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle JDBC Prefetch:So vermeiden Sie, dass der Arbeitsspeicher ausgeht / wie Sie Oracle mit hoher Latenz schneller machen

Grundsätzlich besteht die Standardstrategie von Oracle für aktuelle ojdbc-Jars darin, ein Array pro "Prefetch"-Zeile "vorab zuzuweisen", das die größtmögliche Größe für die Rückgabe dieser Abfrage bietet. Für alle Reihen. In meinem Fall hatte ich also etwas VARCHAR2 (4000) drin, und 50 Threads (Anweisungen) * 3 Spalten von varchar2 * 4000 summierten sich zu mehr als Gigabyte RAM mit einer setFetchSize von ein paar hundert [yikes]. Es scheint keine Option zu geben, um zu sagen:"Dieses Array nicht vorab zuweisen, sondern nur die Größe verwenden, wenn sie hereinkommt." Ojdbc hält diese vorab zugewiesenen Puffer sogar zwischen den vorbereiteten Anweisungen (zwischengespeichert/Verbindung), damit sie wiederverwendet werden können. Definitiv ein Speicherfresser.

Eine Problemumgehung:Verwenden Sie setFetchSize bis zu einem vernünftigen Betrag. Der Standardwert ist 10, was bei Verbindungen mit hoher Latenz ziemlich langsam sein kann. Profilieren und setFetchSize nur so hoch verwenden, wie tatsächlich signifikante Geschwindigkeitsverbesserungen erzielt werden.

Eine andere Problemumgehung besteht darin, die maximale tatsächliche Spaltengröße zu bestimmen und dann die Abfrage durch (unter der Annahme, dass 50 die bekannte maximale tatsächliche Größe ist) zu ersetzen:select substr(column_name, 0, 50)

Andere Dinge, die Sie tun können:Verringern Sie die Anzahl der Prefetch-Zeilen, erhöhen Sie java -Xmx Parameter, wählen Sie nur die Spalten aus, die Sie wirklich benötigen.

Sobald wir in der Lage waren, mindestens 400 Prefetch zu verwenden [stellen Sie sicher, dass Sie ein Profil erstellen, um zu sehen, welche Zahlen für Sie gut sind, mit hoher Latenz haben wir Verbesserungen bis zu einer Prefetch-Größe von 3-4K gesehen] bei allen Abfragen, die Leistung hat sich dramatisch verbessert.

Ich nehme an, wenn Sie wirklich aggressiv gegen spärliche "wirklich lange" Zeilen vorgehen möchten, können Sie möglicherweise eine erneute Abfrage durchführen, wenn Sie auf diese [seltenen] großen Zeilen stoßen.

Details ad nauseum hier