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

Was ist der schnellste Weg, um sequentielle Daten aus der Datenbank abzurufen?

SELECT * FROM table ORDER BY column

Es gibt keinen Grund, die gesamte Tabelle in den Arbeitsspeicher zu saugen. Öffnen Sie einfach einen Cursor und beginnen Sie mit dem Lesen. Sie können Spiele mit Fetch-Größen und mehr spielen, aber die DB behält gerne ihren Platz, während Sie Ihre Zeilen verarbeiten.

Ergänzungen:

Ok, wenn Sie Java verwenden, habe ich eine gute Vorstellung davon, was Ihr Problem ist.

Erstens verwenden Sie nur durch die Verwendung von Java einen Cursor. Das ist im Grunde das, was ein ResultSet in Java ist. Einige ResultSets sind flexibler als andere, aber 99 % von ihnen sind einfach, leiten nur ResultSets weiter, die Sie „als nächstes“ aufrufen, um jede Zeile zu erhalten.

Nun zu deinem Problem.

Das Problem liegt speziell beim Postgres-JDBC-Treiber. Ich weiß nicht, warum sie das tun, vielleicht ist es Spezifikation, vielleicht ist es etwas anderes, aber unabhängig davon hat Postgres die merkwürdige Eigenschaft, dass, wenn Ihre Verbindung autoCommit auf true gesetzt hat, Postgres beschließt, die gesamte Ergebnismenge auf einem der beiden einzusaugen execute-Methode oder die erste nächste Methode. Nicht wirklich wichtig, wo, nur dass, wenn Sie eine Unmenge von Zeilen haben, Sie eine nette OOM-Ausnahme bekommen. Nicht hilfreich.

Dies kann leicht genau das sein, was Sie sehen, und ich weiß, wie es ziemlich frustrierend und verwirrend sein kann.

Die meisten Verbindungen sind standardmäßig auf autoCommit =true eingestellt. Setzen Sie stattdessen einfach autoCommit auf false.

Connection con = ...get Connection...
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
    String col1 = rs.getString(1);
    ...and away you go here...
}
rs.close();
ps.close();
con.close();

Beachten Sie den deutlichen Mangel an Ausnahmebehandlung, der dem Leser als Übung überlassen wird.

Wenn Sie mehr Kontrolle darüber haben möchten, wie viele Zeilen gleichzeitig in den Speicher geladen werden, können Sie Folgendes verwenden:

ps.setFetchSize(numberOfRowsToFetch);

Wenn Sie damit herumspielen, kann sich Ihre Leistung verbessern.

Stellen Sie sicher, dass Sie einen geeigneten Index für die Spalte haben, die Sie in ORDER BY verwenden, wenn Ihnen die Reihenfolge überhaupt wichtig ist.