¿Por qué no empezar a PostgreSQL devolver filas de inmediato?

votos
6

La siguiente consulta devuelve los datos de inmediato:

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 regresar filas:

SELECT time, value from data order by time;

Observo esto, tanto mediante el uso de la herramienta de consulta ( psql) y cuando se consulta utilizando un 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 RDBMS fundamental que no entiendo?
  • ¿Hay alguna manera de hacer que PostgreSQL empezar a devolver las filas de resultados al cliente sin pausa, también para el caso 2?
  • EDIT (ver más abajo) . Parece que setFetchSizees la clave para resolver esto. En mi caso he ejecutar la consulta de pitón, utilizando SQLAlchemy. ¿Cómo puedo configurar esa opción para una sola consulta (ejecutado por session.execute) ? Yo uso el conductor psycopg2.

La columna timees la clave principal, por cierto.

EDITAR:

Creo que este extracto de la documentación del controlador JDBC describe el problema y consejos a una solución (todavía necesito ayuda - ver el elemento de la lista última bala arriba):

Por defecto, el conductor recoge todos los resultados de la consulta a la vez. Esto puede ser un inconveniente para grandes conjuntos de datos por lo que el controlador JDBC proporciona un medio de basar un conjunto de resultados de un cursor de base de datos y sólo ir a buscar un pequeño número de filas.

y

Cambiar el 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. Ajuste del tamaño de recuperación de nuevo a 0 hará que todas las filas que se almacenan en caché (el comportamiento por defecto).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
Publicado el 08/01/2010 a las 13:56
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
4

El conductor psycopg2 dbapi amortigua todo el resultado de la consulta antes de devolver cualquier filas. Tendrá que utilizar el cursor del lado del servidor a buscar incrementalmente resultados. Para ver SQLAlchemy server_side_cursors en los documentos y si está utilizando el ORM el método Query.yield_per () .

SQLAlchemy actualmente no tiene una opción para establecer que por cada consulta única, pero hay un billete con un parche de aplicación de dicha .

Respondida el 08/01/2010 a las 15:52
fuente por usuario

votos
0

En teoría, debido a que su ORDER BY es por clave primaria, una especie de los resultados no debería ser necesario, y el DB de hecho podría devolver datos de inmediato en un orden clave.

Yo esperaría un DB capaz de darse cuenta de esto, y optimizando para ello. Parece que no es PGSQL. * Encogimiento *

Usted no notará ningún impacto si tiene límite de 100 porque es muy rápido para tirar de los 100 resultados de la base de datos, y usted no notará ningún retraso si están reunidos primera y ordenados antes de ser enviado a su cliente .

Sugiero tratando de dejar caer el ORDER BY. Es probable que, los resultados se ordenan correctamente por tiempo de todos modos (incluso puede haber una norma o especificación que obliga a esto, dada su PK), y es posible obtener los resultados más rápidamente.

Respondida el 08/01/2010 a las 13:59
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more