PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come leggere tutte le righe da una tabella enorme?

La versione breve è, chiama stmt.setFetchSize(50); e conn.setAutoCommit(false); per evitare di leggere l'intero ResultSet in memoria.

Ecco cosa dicono i documenti:

Ottenere risultati in base a un cursore

Per impostazione predefinita, il driver raccoglie tutti i risultati della query contemporaneamente. Ciò può essere scomodo per set di dati di grandi dimensioni, quindi il driver JDBC fornisce un mezzo per basare un ResultSet su un cursore del database e recuperare solo un numero ridotto di righe.

Un piccolo numero di righe viene memorizzato nella cache sul lato client della connessione e, una volta esaurito, il successivo blocco di righe viene recuperato riposizionando il cursore.

Nota:

  • I ResultSet basati su cursore non possono essere utilizzati in tutte le situazioni. Ci sono una serie di restrizioni che faranno tornare il driver silenziosamente a recuperare l'intero ResultSet in una volta.

  • La connessione al server deve utilizzare il protocollo V3. Questa è l'impostazione predefinita per (ed è supportata solo da) versioni del server 7.4 e successive.-

  • La connessione non deve essere in modalità autocommit. Il back-end chiude i cursori alla fine delle transazioni, quindi in modalità autocommit il back-end avrà chiuso il cursore prima che qualcosa possa essere recuperato da esso.-

  • L'istruzione deve essere creata con un tipo ResultSet di ResultSet.TYPE_FORWARD_ONLY. Questa è l'impostazione predefinita, quindi nessun codice dovrà essere riscritto per trarne vantaggio, ma significa anche che non puoi scorrere indietro o saltare in altro modo nel ResultSet.-

  • La query data deve essere una singola istruzione, non più istruzioni messe insieme da punto e virgola.

Esempio 5.2. Impostazione delle dimensioni di recupero per attivare e disattivare i cursori.

Modificare il codice in modalità cursore è semplice come impostare la dimensione di recupero dell'istruzione sulla dimensione appropriata. Reimpostando la dimensione di recupero su 0, tutte le righe verranno memorizzate nella cache (il comportamento predefinito).

// 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();