PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie liest man alle Zeilen aus einer riesigen Tabelle?

Die Kurzversion lautet, rufen Sie stmt.setFetchSize(50); auf und conn.setAutoCommit(false); um zu vermeiden, das gesamte ResultSet zu lesen in den Speicher.

Hier ist, was die Dokumente sagen:

Ergebnisse basierend auf einem Cursor abrufen

Standardmäßig sammelt der Treiber alle Ergebnisse für die Abfrage auf einmal. Dies kann bei großen Datensätzen unpraktisch sein, sodass der JDBC-Treiber eine Möglichkeit bietet, ein ResultSet auf einem Datenbankcursor zu basieren und nur eine kleine Anzahl von Zeilen abzurufen.

Eine kleine Anzahl von Zeilen wird auf der Client-Seite der Verbindung zwischengespeichert, und wenn sie erschöpft ist, wird der nächste Block von Zeilen abgerufen, indem der Cursor neu positioniert wird.

Hinweis:

  • Cursorbasierte ResultSets können nicht in allen Situationen verwendet werden. Es gibt eine Reihe von Einschränkungen, die dazu führen, dass der Treiber stillschweigend darauf zurückgreift, das gesamte ResultSet auf einmal abzurufen.

  • Die Verbindung zum Server muss das V3-Protokoll verwenden. Dies ist die Standardeinstellung für (und wird nur unterstützt von) Serverversionen 7.4 und höher.-

  • Die Verbindung darf sich nicht im Autocommit-Modus befinden. Das Backend schließt Cursor am Ende von Transaktionen, sodass das Backend im Autocommit-Modus den Cursor geschlossen hat, bevor irgendetwas von ihm abgerufen werden kann.-

  • Die Anweisung muss mit einem ResultSet-Typ von ResultSet.TYPE_FORWARD_ONLY erstellt werden. Dies ist die Standardeinstellung, sodass kein Code neu geschrieben werden muss, um davon zu profitieren, aber es bedeutet auch, dass Sie nicht rückwärts scrollen oder anderweitig in der Ergebnismenge herumspringen können.-

  • Die angegebene Abfrage muss eine einzelne Anweisung sein, nicht mehrere Anweisungen, die mit Semikolons aneinandergereiht sind.

Beispiel 5.2. Festlegen der Abrufgröße zum Ein- und Ausschalten von Cursorn.

Das Ändern des Codes in den Cursormodus ist so einfach wie das Festlegen der Abrufgröße der Anweisung auf die entsprechende Größe. Wenn Sie die Abrufgröße auf 0 zurücksetzen, werden alle Zeilen zwischengespeichert (das Standardverhalten).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();