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
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.
Durch
pg_stat_activity
die Abfrage gelangt die Abfrage zunächst in die Datenbank alsstate='active'
. Nach ca. 15 Sekunden wechselt der Status auf 'Leerlauf' und zusätzlichxact_start
wird auf gesetztNULL
. Das Warteflag wird niemals auf wahr gesetzt.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.
quelle
COMMIT
zum Beenden der Transaktion ausgegeben wurde. Es hört sich so an, als ob Ihr Problem anderswo als in derAntworten:
Das erste, was Sie hier trennen müssen, sind die Wörter Abfrage , Transaktion und Verbindung .
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_start
ist die null. Sie müssen also die Verbindung schließen, nachdem die Abfrage erfolgreich war.Hinweis: Bevor das Autocommit aktiviert war, wurde die Abfrage in der Mitte der Transaktion belassen, sodass Sie zuerst
commit
und dann müssenclose connection
.quelle