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

Hvad er den hurtigste måde at hente sekventielle data fra databasen?

SELECT * FROM table ORDER BY column

Der er ingen grund til at suge hele bordet ind i RAM. Du skal blot åbne en markør og begynde at læse. Du kan spille spil med hentestørrelser og hvad der ikke, men DB'en vil med glæde beholde sin plads, mens du behandler dine rækker.

Tilføjelser:

Ok, hvis du bruger Java, så har jeg en god idé om, hvad dit problem er.

For det første, bare ved at bruge Java, bruger du en markør. Det er dybest set, hvad et ResultSet er i Java. Nogle resultatsæt er mere fleksible end andre, men 99 % af dem er simple, videresend kun resultatsæt, som du kalder 'næste' for at få hver række.

Nu med hensyn til dit problem.

Problemet er specifikt med Postgres JDBC-driveren. Jeg ved ikke, hvorfor de gør dette, måske er det speciel, måske er det noget andet, men uanset hvad har Postgres den mærkelige egenskab, at hvis din forbindelse har autoCommit sat til sand, så beslutter Postgres sig for at suge hele resultatsættet ind på enten udfør metode eller den første næste metode. Ikke rigtig vigtigt med hensyn til hvor, kun at hvis du har en gazillion rækker, får du en fin OOM-undtagelse. Ikke nyttigt.

Dette kan nemt være præcis det, du ser, og jeg sætter pris på, at det kan være ret frustrerende og forvirrende.

De fleste forbindelse er som standard autoCommit =sand. I stedet skal du blot indstille autoCommit til 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();

Bemærk den tydelige mangel på undtagelseshåndtering, efterladt som en øvelse for læseren.

Hvis du vil have mere kontrol over, hvor mange rækker der hentes i hukommelsen ad gangen, kan du bruge:

ps.setFetchSize(numberOfRowsToFetch);

At lege med det kan forbedre din præstation.

Sørg for, at du har et passende indeks på den kolonne, du bruger i ORDER BY, hvis du overhovedet bekymrer dig om sekventering.



  1. SQLSTATE[HY000] [2002] Et forbindelsesforsøg mislykkedes.. - Ved forsøg på at oprette forbindelse fra lokal til fjernserver

  2. SQLAlchemy:Sådan slettes med join

  3. PHP:Sortering af MySQL-resultater til multidimensionel array

  4. Postgresql - backup af database og gendannelse på anden ejer?