Schnell Oracle Wählen Sie [Große Datenmengen]
Ich habe ein Projekt wobei ich lese riesige Mengen von Daten aus einer Oracle-Datenbank aus Java.
Habe ich das Gefühl, dass die Anwendung, die wir schreiben, die gehen, um die Daten weit schneller, als es uns gegeben mit single threaded SELECT-Abfrage und so habe ich versucht, die Forschung schneller Weise der Gewinnung der Daten.
Hat jemand alles haben, was ich Lesen könnte, das würde helfen, mich mit meinem Schicksal?
- Definieren Sie riesig. Wie viele Zeilen? Wie viele bytes pro Zeile? Sind Sie zu Lesen LONG, BLOB-oder CLOB-Daten? Ist es eine komplizierte join beteiligt? Wie schnell können die consumer-Anwendung werden die Daten verarbeitet? Haben Sie wirklich eine Notlage oder sind Sie sich Gedanken ein problem, das nicht existiert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie noch nicht, die uns eine Menge Informationen darüber, warum es erforderlich werden, um "riesige Datenmengen", in der Java-Anwendung statt, die Verarbeitung der auf der Datenbank-Seite. Obwohl es Ausnahmen geben kann, in der Regel ist dieses signal zu re-denken, das design. Als eine Allgemeine Regel mit Oracle ist es am effektivsten zu tun, wie viel Arbeit, wie Sie können mit reinen set-Operationen (SQL), gefolgt von verfahrenstechnischen Verarbeitung mit dem rdbms-engine (PL/SQL), bevor Sie bringen Ergebnisse zurück an die client-Anwendung.
Verwenden Sie die setFetchSize(int) - Methode, die auf dem Statement oder PreparedStatement, bevor Sie öffnen Sie die Abfrage. Sie sollten Experimentieren Sie mit verschiedenen Größen. Versuchen Sie 75 als Ausgangspunkt.
Eine etwas andere Verwendung, die Leute haben gesagt, dass die PL/SQL bulk Holen "sweet spot" ist zwischen 2000 und 3000, aber ich sah ein benchmark, der zeigte, dass 75 optimal ist.
Eine große fetch-Größe neigen, reduzieren Sie die Anzahl der Roundtrips zwischen client und server. Aber wenn es zu groß ist die Datenbank hat einen großen Puffer und die Netzwerk-software haben können, zu brechen, bis die große Nachricht in eine Menge von Paketen.
Oracle unterstützt parallel DML. Dies gilt im besonderen für SELECT-Abfragen. Letztlich der Engpass wird wohl der IO-lese-Geschwindigkeit. Entweder verwenden Sie schnellere Festplatten oder Streifen die Daten über viele Festplatten.
Update
Als APC darauf hingewiesen, in den Kommentaren Parallel Abfragen/DML ist ein Entreprise Edition feature und ist nicht verfügbar in der Standard Edition.
Auch Parallel DML/Abfrage ist nicht die Lösung aller performance-Probleme. Seit mehr als einem Prozess benutzt werden, von der Abfrage Sie können den Durchsatz verbessern, aber auf Kosten der Parallelität. Der Zweck der Parallelität ist die Verwendung von mehr Ressourcen für die Verarbeitung der Abfrage schneller. Wenn die Abfrage IO-bound oder CPU-gebunden ist, gibt es keine zusätzlichen Ressourcen zu nutzen, und das hinzufügen von Parallelität wird nur machen die Sache noch schlimmer.
Aus dem link oben:
Erstens 'großen Daten' to database Menschen ist [mindestens] Gigabyte, in dem Fall vermute ich, dass deine Probleme werden mit der Lektüre dieser Art von Volumen in Ihre Prozesse, Speicher und aggregieren Sie Sie dort. Warum denkst du, dass ein single-threaded wählen, wird der Engpass sein ?
Wenn der Engpass wurden immer die Daten von der Festplatte, dann mit mehreren threads ziehen Daten aus der gleichen Festplatte wäre nicht unbedingt schneller und kann sogar langsamer sein. Aber wenn Sie verteilt die Daten auf separaten Festplatten, separate threads schneller gehen würde. Wenn mit SSD, Sie glaube nicht, dass Festplatten ein Streit Punkt können wir woanders suchen.
Wenn der Engpass war die Netzwerk-Bandbreite, wieder mehrere threads würden nicht passen mehr Daten durch die Leitung nicht schneller. Sie können sogar nutzen aus entladen der Daten, um eine flache Datei, komprimieren und übertragen, das.
Wenn die wählen Sie sortiert oder kommt aus einem hash-join, können Sie effizienter Speicher mit einem einzigen thread. Mehrere Sitzungen würden teilen müssen, die Maschine zu Gedenken.
Wenn es eine CPU-intensive Verarbeitung von mehreren threads helfen kann. Das könnte so einfach sein wie mit mehreren verbindungen aus java, die jeweils ein anderes Stück von Daten (zB A-K und L-Z), aber es würde sehr viel davon abhängen, WÄHLEN.
Ich Stimme mit dpbradley, dass Sie sollten bestimmen, den Engpass ersten. Wenn Sie die Daten und wählen Sie, es sollte einfach genug sein, um zu bestimmen, wie lange es dauert (sowohl auf dem lokalen Rechner und über das Netzwerk), und ein trace wäre ein notwendiger Ausgangspunkt, um wirklich in, wie könnte es beschleunigt werden.