PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Quel est le moyen le plus rapide de récupérer des données séquentielles à partir d'une base de données ?

SELECT * FROM table ORDER BY column

Il n'y a aucune raison d'aspirer toute la table dans la RAM. Ouvrez simplement un curseur et commencez à lire. Vous pouvez jouer à des jeux avec des tailles de récupération et autres, mais la base de données se fera un plaisir de garder sa place pendant que vous traitez vos lignes.

Addenda :

Ok, si vous utilisez Java, j'ai une bonne idée de votre problème.

Tout d'abord, juste en utilisant Java, vous utilisez un curseur. C'est essentiellement ce qu'est un ResultSet en Java. Certains ResultSets sont plus flexibles que d'autres, mais 99 % d'entre eux sont simples, transmettent uniquement des ResultSets que vous appelez "suivant" pour obtenir chaque ligne.

Passons maintenant à votre problème.

Le problème concerne spécifiquement le pilote Postgres JDBC. Je ne sais pas pourquoi ils font cela, peut-être que c'est une spécification, peut-être que c'est autre chose, mais quoi qu'il en soit, Postgres a la curieuse caractéristique que si votre connexion a autoCommit défini sur true, alors Postgres décide d'aspirer l'ensemble des résultats soit le exécuter la méthode ou la première méthode suivante. Pas vraiment important de savoir où, seulement si vous avez un million de lignes, vous obtenez une belle exception OOM. Inutile.

Cela peut facilement être exactement ce que vous voyez, et je comprends à quel point cela peut être assez frustrant et déroutant.

La plupart des connexions par défaut sont autoCommit =true. Au lieu de cela, définissez simplement autoCommit sur 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();

Notez l'absence flagrante de gestion des exceptions, laissée en exercice au lecteur.

Si vous voulez plus de contrôle sur le nombre de lignes extraites à la fois en mémoire, vous pouvez utiliser :

ps.setFetchSize(numberOfRowsToFetch);

Jouer avec cela pourrait améliorer vos performances.

Assurez-vous d'avoir un index approprié sur la colonne que vous utilisez dans ORDER BY si vous vous souciez du séquençage.