devuelve la consulta siguientes datos de inmediato:¿Por qué no postgresql comienza a devolver filas inmediatamente?
SELECT time, value from data order by time limit 100;
Sin la cláusula de límite, se tarda mucho tiempo antes de que se inicie el servidor filas que regresan:
SELECT time, value from data order by time;
observo esto, tanto mediante el uso de la herramienta de consulta (psql
) y al consultar usando una API.
Preguntas/cuestiones:
- la cantidad de trabajo que el servidor tiene que hacer antes de empezar a devolver filas debe ser el mismo para ambas sentencias de selección. ¿Correcto?
- Si es así, ¿por qué hay un retraso en el caso 2?
- ¿Hay algún problema de RDBMS fundamental que no entiendo?
- ¿Hay alguna manera de que postgresql comience a devolver las filas de resultados al cliente sin pausa, también para el caso 2?
- EDITAR (ver abajo). Parece que
setFetchSize
es la clave para resolver esto. En mi caso, ejecuto la consulta de python, usando SQLAlchemy. ¿Cómo puedo configurar esa opción para una sola consulta (ejecutada porsession.execute
)? Yo uso el controlador psycopg2.
La columna time
es la clave principal, por cierto.
EDIT:
Creo que este extracto de la JDBC driver documentation describe el problema y consejos a una solución (todavía necesito ayuda - véase el último elemento de la lista de bala arriba):
Por defecto el controlador recopila todos los resultados de la consulta a la vez. Esto puede ser inconveniente para grandes conjuntos de datos, por lo que el controlador JDBC proporciona un medio para basar un ResultSet en un cursor de base de datos y solo recuperar un pequeño número de filas.
y
Cambio de código a modo de cursor es tan simple como establecer el tamaño de recuperación de la Declaración para el tamaño apropiado. Volver a establecer el tamaño de recuperación en 0 hará que todas las filas se guarden en caché (el comportamiento predeterminado).
// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();
// Turn use of the cursor on.
st.setFetchSize(50);
¿Qué driver estás usando? (probablemente psycopg2, pero confirme) –
Usted se ayudó a sí mismo. ¡Bien hecho! –
Sí, el controlador es psycopg2. – codeape