私が開発したプログラムは、postgresql を使用しています。そのプログラムはplpgsql関数を実行しているため、非常に長い時間(数時間または数日)かかります。その機能がその長い時間実行されていることを確認したい。
どうすればそれを知ることができますか? 実行時間が長くなるため、関数のループで「通知を上げる」を使用したくありません。
私が開発したプログラムは、postgresql を使用しています。そのプログラムはplpgsql関数を実行しているため、非常に長い時間(数時間または数日)かかります。その機能がその長い時間実行されていることを確認したい。
どうすればそれを知ることができますか? 実行時間が長くなるため、関数のループで「通知を上げる」を使用したくありません。
プロセスを調べることで、実行中かどうかを確認できpg_stat_activity
ます。ただし、関数が進行中かどうかはわかりません。
pg_stat_activity
結合して、そのテーブルにpg_locks
開いている ( granted = False
) ロックがあるかどうかを確認することにより、そのバックエンドがロックでブロックされているかどうかを確認できます。繰り返しますが、進行中かどうかはわかりません。進行していない場合は、ロックされていないということだけです。
関数の進行状況を監視したい場合は、ログ メッセージを出力するか、進行状況を監視するための他のハックのいずれかを使用する必要があります。進行状況メッセージNOTIFY
にペイロードを(ab) 使用できます。別の方法として、プロシージャで項目を処理するたびLISTEN
に呼び出すシーケンスを作成することもできます。nextval
その後SELECT * FROM the_sequence_name;
、別のトランザクションでおおよその進行状況を確認できます。
一般に、クライアントに送信されずにログにのみ表示されるメッセージを記録するように、それ以上に設定client_min_messages
することをお勧めします。オーバーヘッドを減らすには、カウンターを保持し、ループの 100 回または 1000 回ごとにログを記録し、たまにしかログを記録しないようにします。確かに、カウンターの更新にはコストがかかりますが、このような大きくて遅い PL/PgSQL プロシージャのコストに比べればかなり低いものです。notice
RAISE LOG