¿Cómo depuro una consulta inactiva?


13

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

  1. 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.

  2. Al consultar pg_stat_activity, la consulta inicialmente ingresa a la base de datos como state='active'. Después de unos 15 segundos, el estado cambia a 'inactivo' y, adicionalmente, xact_startse establece en NULL. El indicador de espera nunca se establece en verdadero.

  3. 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.


2
Si el estado está inactivo y NO está esperando, la consulta está completa pero la conexión a la base de datos no está cerrada. inactivo en la transacción, también, significa que la consulta está completa pero no COMMITse ha emitido ninguna para finalizar la transacción. Parece que su problema puede estar en otro lugar que no sea el DB ..
Joishi Bodio

Sí, creo que tienes razón. El problema está en cómo Python maneja la consulta, no es un problema con la base de datos.
Kurt Spindler

Respuestas:


6

Lo primero que debe separar aquí son las palabras consulta , transacción y conexión .

  1. 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_startes nulo. Por lo tanto, debe cerrar la conexión después de que la consulta sea exitosa.

  2. 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 commity luego close connection.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.