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

Hvordan læser man alle rækker fra en stor tabel?

Den korte version er, kald stmt.setFetchSize(50); og conn.setAutoCommit(false); for at undgå at læse hele ResultSet i hukommelsen.

Her er, hvad lægerne siger:

Få resultater baseret på en markør

Som standard samler driveren alle resultaterne for forespørgslen på én gang. Dette kan være ubelejligt for store datasæt, så JDBC-driveren giver mulighed for at basere et resultatsæt på en databasemarkør og kun hente et lille antal rækker.

Et lille antal rækker cachelagres på klientsiden af ​​forbindelsen, og når den er opbrugt, hentes den næste blok af rækker ved at flytte markøren.

Bemærk:

  • Markørbaserede resultatsæt kan ikke bruges i alle situationer. Der er en række begrænsninger, som vil få driveren til lydløst at falde tilbage til at hente hele ResultSet på én gang.

  • Forbindelsen til serveren skal bruge V3-protokollen. Dette er standard for (og understøttes kun af) serverversioner 7.4 og nyere.-

  • Forbindelsen må ikke være i autocommit-tilstand. Backend lukker markører ved slutningen af ​​transaktioner, så i autocommit-tilstand vil backend have lukket markøren, før noget kan hentes fra den.-

  • Statementet skal oprettes med en ResultSet-type af ResultSet.TYPE_FORWARD_ONLY. Dette er standard, så ingen kode skal omskrives for at drage fordel af dette, men det betyder også, at du ikke kan scrolle baglæns eller på anden måde hoppe rundt i resultatsættet.-

  • Den angivne forespørgsel skal være et enkelt udsagn, ikke flere udsagn sat sammen med semikolon.

Eksempel 5.2. Indstilling af hentestørrelse for at slå markører til og fra.

Ændring af kode til markørtilstand er lige så simpelt som at indstille hentestørrelsen for erklæringen til den passende størrelse. Indstilling af hentestørrelsen tilbage til 0 vil medføre, at alle rækker cachelagres (standardadfærden).

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


  1. PLSQL JDBC:Hvordan får man sidste række-id?

  2. Hvordan kan jeg gå gennem alle rækker i en tabel? (MySQL)

  3. Sådan opretter du den linkede server til SQL Server 2008, hvor vi har databasen fra 2000 og 2005

  4. Forbedret støtte til genopbygning af parallelle statistikker