アイドルクエリをデバッグするにはどうすればよいですか?


13

データベースで毎日実行しているバッチクエリがあります。ただし、アイドル状態のままになっているようで、何が起こっているのかをデバッグするのが非常に困難です。

クエリは、同時に挿入されるテーブルの集計であり、何らかの問題に関連していると推測しています。(集計は前日のデータに基づいているため、挿入は結果に影響しません。)

手がかり

  1. これは、sqlalchemyを使用してPythonスクリプト内で実行しています。ただし、トランザクションレベルを自動コミットに設定しているので、トランザクション内に物事がラップされるとは思いません。一方、sqlターミナルでクエリを手動で実行しても、クエリがハングすることはありません。

  2. 照会することによりpg_stat_activity、クエリは最初としてデータベースに入ってきますstate='active'。おそらく15秒後に、状態が「アイドル」に変わり、さらにxact_startがに設定されNULLます。待機フラグがtrueに設定されることはありません。

  3. sqlalchemyのトランザクションレベルの自動コミットを理解する前に、代わりに状態'idle in transaction'ではなく状態でハングし'idle'ます。そして、その変更を行ってからハングする可能性がわずかに少なくなりますか?

私はこれ以上深く掘る準備ができていないように感じます。明確な答えを出さずに、さまざまな状態や関連するpostgres内部についてさらに説明するフィードバックも歓迎します。


2
状態がアイドルで待機中でない場合、クエリは完了していますが、データベースへの接続は閉じられていません。また、トランザクションでアイドル状態は、クエリは完了したがCOMMIT、トランザクションを終了するために発行されていないことを意味します。あなたの問題は別の場所デシベル以上かもしれようです。..聞こえる
Joishi Bodio

ええ、あなたは正しいと思います。問題は、データベースの問題ではなく、Pythonがクエリを処理する方法にあります。
カートスピンドラー

回答:


6

ここで最初に分離する必要があるのは、クエリトランザクション、および接続という単語です。

  1. 手がかり:クエリが実行されます-アクティブな状態です。その後、クエリは終了しますが、接続はオンのままです-アイドル状態。トランザクションはない(コミットされている)ため、xact_startnullです。そのため、クエリが成功した後に接続を閉じる必要があります。

  2. 手がかり:オートコミットがオンになる前に、クエリはトランザクションの途中に残っていたので、最初にあなたがする必要がcommitありclose connectionます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.