Wie debugge ich eine Leerlaufabfrage?


13

Ich habe eine Stapelabfrage, die täglich in meiner Datenbank ausgeführt wird. Es scheint jedoch im Leerlauf zu stecken, und ich habe große Schwierigkeiten beim Debuggen der Vorgänge.

Die Abfrage ist eine Aggregation auf einer Tabelle, die gleichzeitig eingefügt wird. Ich vermute, das hängt irgendwie mit dem Problem zusammen. (Die Aggregation bezieht sich auf die Daten der vorherigen Tage, daher sollten die Einfügungen keine Auswirkungen auf die Ergebnisse haben.)

Hinweise

  1. Ich führe dies in einem Python-Skript mit sqlalchemy aus. Ich habe jedoch die Transaktionsstufe auf Autocommit gesetzt, sodass ich nicht glaube, dass die Dinge in eine Transaktion eingebunden werden. Auf der anderen Seite wird die Abfrage nicht hängen, wenn ich sie manuell in SQL Terminal ausführe.

  2. Durch pg_stat_activitydie Abfrage gelangt die Abfrage zunächst in die Datenbank als state='active'. Nach ca. 15 Sekunden wechselt der Status auf 'Leerlauf' und zusätzlich xact_startwird auf gesetzt NULL. Das Warteflag wird niemals auf wahr gesetzt.

  3. Bevor ich die Transaktionsebene autocommit für sqlalchemy herausgefunden , wäre es stattdessen in Staat hängen 'idle in transaction'statt 'idle'. Und es hängt möglicherweise etwas seltener, seit diese Änderung vorgenommen wurde?

Ich habe das Gefühl, dass ich nicht in der Lage bin, tiefer zu graben als bisher. Jede Rückmeldung, auch wenn mehr über verschiedene Zustände und relevante Postgres-Interna erklärt wird, ohne eine definitive Antwort zu geben, wäre sehr dankbar.


2
Wenn der Status inaktiv ist und NICHT wartet, ist die Abfrage abgeschlossen, aber die Verbindung zur Datenbank wird nicht geschlossen. Leerlauf in der Transaktion bedeutet auch, dass die Abfrage abgeschlossen ist, aber keine COMMITzum Beenden der Transaktion ausgegeben wurde. Es hört sich so an, als ob Ihr Problem anderswo als in der
Datenbank liegt

Ja, ich denke du hast recht. Es geht darum, wie Python mit der Abfrage umgeht, nicht um ein Problem mit der Datenbank.
Kurt Spindler

Antworten:


6

Das erste, was Sie hier trennen müssen, sind die Wörter Abfrage , Transaktion und Verbindung .

  1. Hinweis: Ihre Abfrage wird ausgeführt - sie befindet sich im aktiven Zustand. Danach endet die Abfrage, aber die Verbindung bleibt bestehen - der Ruhezustand. Es gibt keine Transaktion (sie wurde festgeschrieben), daher xact_startist die null. Sie müssen also die Verbindung schließen, nachdem die Abfrage erfolgreich war.

  2. Hinweis: Bevor das Autocommit aktiviert war, wurde die Abfrage in der Mitte der Transaktion belassen, sodass Sie zuerst commitund dann müssen close connection.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.