sql >> Database >  >> RDS >> PostgreSQL

Hoe lees je alle rijen van een enorme tafel?

De korte versie is, bel stmt.setFetchSize(50); en conn.setAutoCommit(false); om te voorkomen dat de hele ResultSet wordt gelezen in het geheugen.

Dit is wat de documenten zeggen:

Resultaten krijgen op basis van een cursor

Standaard verzamelt de driver alle resultaten voor de query in één keer. Dit kan onhandig zijn voor grote datasets, dus de JDBC-driver biedt een manier om een ​​ResultSet op een databasecursor te baseren en slechts een klein aantal rijen op te halen.

Een klein aantal rijen wordt aan de clientzijde van de verbinding in de cache opgeslagen en wanneer deze uitgeput zijn, wordt het volgende rijenblok opgehaald door de cursor te verplaatsen.

Opmerking:

  • Cursorgebaseerde ResultSets kunnen niet in alle situaties worden gebruikt. Er zijn een aantal beperkingen waardoor de bestuurder geruisloos terugvalt op het in één keer ophalen van de hele ResultSet.

  • De verbinding met de server moet het V3-protocol gebruiken. Dit is de standaard voor (en wordt alleen ondersteund door) serverversies 7.4 en hoger.-

  • De verbinding mag niet in de autocommit-modus staan. De backend sluit cursors aan het einde van transacties, dus in de autocommit-modus heeft de backend de cursor gesloten voordat er iets van kan worden opgehaald.-

  • De verklaring moet worden gemaakt met het ResultSet-type ResultSet.TYPE_FORWARD_ONLY. Dit is de standaardinstelling, dus er hoeft geen code te worden herschreven om hiervan te profiteren, maar het betekent ook dat u niet achteruit kunt bladeren of op een andere manier kunt rondspringen in de ResultSet.-

  • De opgegeven query moet een enkele instructie zijn, niet meerdere instructies die met puntkomma's aan elkaar worden geregen.

Voorbeeld 5.2. Ophaalgrootte instellen om cursors aan en uit te zetten.

Het wijzigen van de code naar de cursormodus is net zo eenvoudig als het instellen van de ophaalgrootte van de instructie op de juiste grootte. Als de ophaalgrootte weer op 0 wordt gezet, worden alle rijen in de cache opgeslagen (het standaardgedrag).

// 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. Een externe sleutel toewijzen aan een aangepaste kolomnaam

  2. Een DB-koppeling maken tussen twee Oracle-instanties

  3. Hoe te bestellen op maandnaam in MySQL

  4. Zet de primaire sleutel neer met behulp van een script in de SQL Server-database