Tengo una consulta por lotes que estoy ejecutando diariamente en mi base de datos. Sin embargo, parece estar atascado en estado inactivo, y tengo muchas dificultades para depurar lo que está sucediendo.
La consulta es una agregación en una tabla que se inserta simultáneamente, lo que supongo que de alguna manera se relaciona con el problema. (La agregación está en los datos de días anteriores, por lo que las inserciones no deberían afectar los resultados).
Pistas
Estoy ejecutando esto dentro de un script de python usando sqlalchemy. Sin embargo, establecí el nivel de transacción en confirmación automática, por lo que no creo que las cosas se envuelvan dentro de una transacción. Por otro lado, no veo que la consulta se cuelgue cuando la ejecuto manualmente en la terminal SQL.
Al consultar
pg_stat_activity
, la consulta inicialmente ingresa a la base de datos comostate='active'
. Después de unos 15 segundos, el estado cambia a 'inactivo' y, adicionalmente,xact_start
se establece enNULL
. El indicador de espera nunca se establece en verdadero.Antes de que me di cuenta el nivel de transacción de confirmación automática para sqlalchemy, sería en cambio en el estado de colgar
'idle in transaction'
en lugar de'idle'
. ¿Y posiblemente cuelga un poco menos frecuentemente desde que hizo ese cambio?
Siento que no estoy equipado para profundizar más de lo que tengo en esto. Cualquier comentario, incluso explicando más sobre diferentes estados y postgres relevantes internos sin dar una respuesta definitiva, sería muy apreciado.
fuente
COMMIT
se ha emitido ninguna para finalizar la transacción. Parece que su problema puede estar en otro lugar que no sea el DB ..Respuestas:
Lo primero que debe separar aquí son las palabras consulta , transacción y conexión .
Pista: su consulta se ejecuta, está en estado activo. Después de eso, la consulta finaliza pero la conexión permanece activa: el estado inactivo. No hay transacción (se ha confirmado), por lo que
xact_start
es nulo. Por lo tanto, debe cerrar la conexión después de que la consulta sea exitosa.Pista: antes de que se activara la confirmación automática, la consulta se dejaba en el medio de la transacción, así que primero tendría que hacerlo
commit
y luegoclose connection
.fuente