Frage

Ich bin in einer PostgreSQL-Datenbank eine Abfrage für eine Tabelle ausgeführt wird. Die Datenbank befindet sich auf einem Remote-Rechner. Die Tabelle hat rund 30 Untertabellen postgresql mit Partitionierungsfunktion .

Die Abfrage wird eine große Ergebnismenge zurück, was rund 1,8 Millionen Zeilen.

In meinem Code ich Feder jdbc Unterstützung verwenden, Methode JdbcTemplate.query , aber mein RowCallbackHandler wird nicht aufgerufen werden.

Meine beste Vermutung ist, dass der postgresql JDBC-Treiber (ich verwende Version 8.3-603.jdbc4) das Ergebnis im Speicher akkumuliert vor meinem Code aufrufen. Ich dachte, die Recomended .

Diese Abfrage funktioniert gut, wenn ich Oracle XE verwendet. Aber ich versuche wegen der Partitionierungsfunktion zu migrieren PostgreSQL, die in Oracle XE nicht verfügbar ist.

Meine Umwelt:

  • Postgresql 8.3
  • Windows Server 2008 Enterprise 64-Bit
  • JRE 1.6 64-Bit
  • Feder 2.5.6
  • Postgresql JDBC-Treiber von 8,3 bis 603
War es hilfreich?

Lösung

Um einen Cursor zu verwenden, um Daten abzurufen Sie eine Fetch-Größe, um die Einstellung der ResultSet Art von ResultSet.TYPE_FORWARD_ONLY (Standardeinstellung) und autocommit auf false zusätzlich zu setzen haben. Das ist in dem Dokument, das Sie verknüpfen verwiesen, aber Sie nicht explizit erwähnt, dass Sie diese Schritte getan haben.

Seien Sie mit PostgreSQL-Partitionierungsschema vorsichtig. Es ist wirklich sehr schreckliche Dinge mit dem Optimierer und kann massive Performance-Probleme verursacht, in denen es nicht (abhängig von Besonderheiten Ihrer Daten) werden soll. In jedem Fall ist Ihre Zeile nur 1.8M Reihen? Es gibt keinen Grund, dass es je nach Größe aufgeteilt werden müßte allein gegeben, dass sie in geeigneter Weise indiziert ist.

Andere Tipps

Ich wette, dass es nicht einen einzigen Client Ihrer Anwendung, die 1.8M Reihen alle zur gleichen Zeit benötigt. Sie sollten die Ergebnisse in kleinere Stücke Stück einer vernünftigen Art und Weise denken und den Nutzern die Möglichkeit, sie zu durchlaufen.

Das ist, was Google tut. Wenn Sie eine Suche tun könnte es Millionen von Hits, aber sie kehren 25 Seiten gleichzeitig mit der Idee, dass Sie finden, was Sie auf der ersten Seite werden sollen.

Wenn es nicht Kunde ist, und die Ergebnisse werden in irgendeiner Weise massiert, würde ich empfehlen die Datenbank Crunch alle diese Zeilen zu lassen und einfach das Ergebnis zurück. Es macht keinen Sinn 1.8M Reihen zurückkehren nur eine Berechnung auf der mittleren Ebene zu tun.

Wenn keiner von denen gilt, haben Sie ein echtes Problem. Zeit, es zu überdenken.

Nachdem die späteren Antworten zu lesen, es klingt für mich wie dies eher eine Reporting-Lösung ist, die sollte in Batch oder in Echtzeit berechnet und in Tabellen gespeichert knirschte werden, die nicht Teil des Transaktionssystems sind. Es gibt keine Möglichkeit 1.8M Reihen der mittleren Ebene, dass bringen für Moving Averages Berechnung skaliert werden kann.

würde ich empfehlen, sich neu auszurichten - anfangen, über ihn als Reporting-Lösung zu denken.

Die fetchSize Eigenschaft arbeitete wie unter Postgres-Handbuch .

Mein Fehler war, dass ich Auto einstellen begehen = false zu einer Verbindung von einem Verbindungspool, der nicht die Verbindung durch die vorbereitete Erklärung wurde verwendet.

Vielen Dank für das Feedback.

habe ich alles oben, aber ich brauchte ein letztes Stück. Sicherzustellen, dass der Anruf in einer Transaktion eingewickelt wird und die Transaktion nur gesetzt, zu lesen, so dass kein Rollback-Zustand erforderlich ist,

Ich habe diese: @Transactional(readOnly = true)

Prost.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top