1

私が開発したプログラムは、postgresql を使用しています。そのプログラムはplpgsql関数を実行しているため、非常に長い時間(数時間または数日)かかります。その機能がその長い時間実行されていることを確認したい。

どうすればそれを知ることができますか? 実行時間が長くなるため、関数のループで「通知を上げる」を使用したくありません。

4

1 に答える 1

2

プロセスを調べることで、実行中かどうかを確認でき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 プロシージャのコストに比べればかなり低いものです。noticeRAISE LOG

于 2013-07-22T07:22:28.377 に答える