sql >> Databasteknik >  >> RDS >> PostgreSQL

Vad är det snabbaste sättet att hämta sekventiell data från databasen?

SELECT * FROM table ORDER BY column

Det finns ingen anledning att suga in hela bordet till RAM. Öppna bara en markör och börja läsa. Du kan spela spel med hämtningsstorlekar och vad inte, men DB kommer gärna att behålla sin plats medan du bearbetar dina rader.

Tillägg:

Ok, om du använder Java så har jag en bra uppfattning om vad ditt problem är.

För det första, bara genom att använda Java, använder du en markör. Det är i princip vad en ResultSet är i Java. Vissa resultatuppsättningar är mer flexibla än andra, men 99 % av dem är enkla, vidarebefordra endast resultatuppsättningar som du anropar "nästa" för att få varje rad.

Nu till ditt problem.

Problemet är specifikt med Postgres JDBC-drivrutinen. Jag vet inte varför de gör detta, kanske är det spec, kanske är det något annat, men oavsett har Postgres den märkliga egenskapen att om din Connection har autoCommit satt till true, så bestämmer Postgres sig för att suga in hela resultatuppsättningen på antingen exekveringsmetoden eller den första nästa metoden. Inte riktigt viktigt med var, bara att om du har en gazillion rader får du ett fint OOM-undantag. Inte till hjälp.

Det här kan lätt vara exakt vad du ser, och jag uppskattar hur det kan vara ganska frustrerande och förvirrande.

Most Connection är som standard autoCommit =true. Istället ställer du helt enkelt in autoCommit till 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();

Notera den tydliga bristen på undantagshantering, lämnad som en övning för läsaren.

Om du vill ha mer kontroll över hur många rader som hämtas åt gången till minnet kan du använda:

ps.setFetchSize(numberOfRowsToFetch);

Att leka med det kan förbättra din prestation.

Se till att du har ett lämpligt index på kolumnen du använder i ORDER BY om du överhuvudtaget bryr dig om sekvensering.



  1. MariaDB numeriska funktioner (fullständig lista)

  2. Insättningshastigheten minskar när tabellen växer i mysql

  3. hur skapar man inloggningssida i Android-appen?

  4. Aloha editor:Infogar bilder/bilder