sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cuál es la forma más rápida de recuperar datos secuenciales de la base de datos?

SELECT * FROM table ORDER BY column

No hay razón para absorber toda la tabla en la RAM. Simplemente abra un cursor y comience a leer. Puede jugar juegos con tamaños de recuperación y otras cosas, pero la base de datos mantendrá felizmente su lugar mientras procesa sus filas.

Anexo:

Ok, si estás usando Java, entonces tengo una buena idea de cuál es tu problema.

Primero, solo usando Java, estás usando un cursor. Eso es básicamente lo que es un ResultSet en Java. Algunos ResultSets son más flexibles que otros, pero el 99% de ellos son simples, reenvían solo los ResultSets a los que llama 'siguiente' para obtener cada fila.

Ahora en cuanto a su problema.

El problema es específicamente con el controlador Postgres JDBC. No sé por qué hacen esto, tal vez sea una especificación, tal vez sea otra cosa, pero independientemente, Postgres tiene la característica curiosa de que si su conexión tiene autoCommit establecido en verdadero, entonces Postgres decide absorber todo el conjunto de resultados en cualquiera de los método de ejecución o el primer método siguiente. No es realmente importante en cuanto a dónde, solo que si tiene miles de filas, obtiene una buena excepción OOM. No es útil.

Esto puede ser exactamente lo que estás viendo, y entiendo que puede ser bastante frustrante y confuso.

La mayoría de las conexiones tienen como valor predeterminado autoCommit =true. En su lugar, simplemente establezca autoCommit en falso.

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();

Tenga en cuenta la clara falta de manejo de excepciones, que se deja como ejercicio para el lector.

Si desea tener más control sobre cuántas filas se recuperan a la vez en la memoria, puede usar:

ps.setFetchSize(numberOfRowsToFetch);

Jugar con eso podría mejorar tu rendimiento.

Asegúrese de tener un índice apropiado en la columna que usa en ORDER BY si le importa la secuenciación.