sql >> Database >  >> RDS >> PostgreSQL

Wat is de snelste manier om opeenvolgende gegevens uit de database op te halen?

SELECT * FROM table ORDER BY column

Er is geen reden om de hele tabel in RAM te zuigen. Open gewoon een cursor en begin met lezen. Je kunt games spelen met ophaalgroottes en wat niet, maar de DB zal graag zijn plaats behouden terwijl je je rijen verwerkt.

Aanvullingen:

Ok, als je Java gebruikt, dan heb ik een goed idee wat je probleem is.

Ten eerste, gewoon door Java te gebruiken, gebruik je een cursor. Dat is eigenlijk wat een ResultSet is in Java. Sommige ResultSets zijn flexibeler dan andere, maar 99% van hen zijn eenvoudige, alleen doorsturen ResultSets die u 'volgende' aanroept om elke rij te krijgen.

Nu wat betreft uw probleem.

Het probleem ligt specifiek bij de Postgres JDBC-driver. Ik weet niet waarom ze dit doen, misschien is het een specificatie, misschien is het iets anders, maar hoe dan ook, Postgres heeft het merkwaardige kenmerk dat als je verbinding autoCommit op true heeft ingesteld, Postgres besluit om de volledige resultatenset op te zuigen op ofwel de execute methode of de eerst volgende methode. Niet echt belangrijk waar, alleen dat als je een miljard rijen hebt, je een mooie OOM-uitzondering krijgt. Niet nuttig.

Dit kan gemakkelijk precies zijn wat je ziet, en ik begrijp hoe het behoorlijk frustrerend en verwarrend kan zijn.

De meeste verbindingen zijn standaard ingesteld op autoCommit =true. Stel in plaats daarvan autoCommit in op 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();

Let op het duidelijke gebrek aan afhandeling van uitzonderingen, overgelaten als een oefening voor de lezer.

Als u meer controle wilt over hoeveel rijen er tegelijk in het geheugen worden opgehaald, kunt u het volgende gebruiken:

ps.setFetchSize(numberOfRowsToFetch);

Door daarmee te spelen, kunnen je prestaties verbeteren.

Zorg ervoor dat je een geschikte index hebt in de kolom die je gebruikt in de ORDER BY als je echt om volgorde geeft.



  1. Laatst ingevoegde ID ophalen van doctrine en native mysql-query

  2. Hoe geef ik de volledige inhoud van de LOB-kolom weer in Oracle SQL*Plus?

  3. Een Java-programma activeren op basis van database-updates en tijdsinterval

  4. Xampp MySQL start niet - Poging om MySQL-service te starten...