PostgreSQL 9.6 - VACUUM Progress Reporting


そういえば、9.6のVACUUM Progress Reportingをきちんと試してなかった。

VACUUM Progress Reporting

この機能は名前のとおり、VACUUMの進捗状況をレポートしてくれるというもの。
進捗状況は pg_stat_progress_vacuum ビューに書き込まれる。
なお、このビューに表示されるレコードはVACUUM処理中のみ存在する。VACUUMが完了すると消えてしまう。
なので、VACUUMがすぐに終わっちゃうと、進捗を見ようとしても見れないというもどかしさw

かといって、うちのようなpoorな環境では巨大なテーブルを作るわけにもいかない・・・。

vacuum_cost系パラメータを使う

ということで、小さいテーブルでもVACUUM Progress Reportingを見たい場合には、VACUUMの動作を遅くすればいいのですよ。
このために、Cost-based Vacuum Delay系のパラメータを調整する。
パラメータは数種類あるけど、まあ vacuum_cost_delay をちょっと調整すれば十分かと。このパラメータはデフォルト値が 0 つまり遅延なく行う設定になっているけど、これを 10 (ms) とかにしていれば、pgbench_accounts (scale=10)程度のテーブルでもそれなりにVACUUM処理に時間がかかるようになる。

psql コマンドも併用する

あとはVACUUMを実行させて、別ターミナルから pg_stat_progress_vacuum ビューを定期的に検索するようにすれば良い。
たとえば、以下の様なSQLを発行する。
で、これを繰り返し実行する。そういうときに \watch コマンドを使う。

\watch 0.1

こうすると、0.1秒間隔で直前のコマンドを実行してくれる。
ヘッダ部分が邪魔なら \t コマンドで結果行だけ表示するようにすれば良い。
さらに、結果を書き込むように、 \o filename で出力ファイルを指定しておくと、後から参照するのも楽になる。

結果

テキトーにUPDATEして汚した scale factor=10 の pgbench_accounts テーブルを含む、データベース全体にVACUUMをかけて、以下のSQLでVACUUM Progress Reportingを表示させてみた。

SELECT 
 p.relname, 
 v.phase, v.heap_blks_total, v.heap_blks_scanned, v.heap_blks_vacuumed, v.index_vacuum_count 
 FROM pg_stat_progress_vacuum as v JOIN pg_class as p 
 ON (v.relid = p.oid);

第1カラムはテーブル名、第2カラムがVacuumのステータスになる。
第3カラムは総ヒープブロック数、第4カラムはスキャンしたブロック数、第5カラムがバキュームされたブロック数・・・のような感じ。

 pgbench_accounts | scanning heap |           18033 |               506 |                  0 |                  0
 pgbench_accounts | scanning heap |           18033 |              1260 |                  0 |                  0
 pgbench_accounts | scanning heap |           18033 |             17067 |                  0 |                  0
 pgbench_accounts | scanning heap |           18033 |             17157 |                  0 |                  0
 pgbench_accounts | scanning heap |           18033 |             17467 |                  0 |                  0
 pgbench_accounts | vacuuming indexes |           18033 |             18033 |                  0 |                  0
(中略)
 pgbench_accounts | vacuuming indexes |           18033 |             18033 |                  0 |                  0
 pgbench_accounts | vacuuming indexes |           18033 |             18033 |                  0 |                  0
 pgbench_accounts | vacuuming heap |           18033 |             18033 |              16767 |                  1
 pgbench_accounts | vacuuming heap |           18033 |             18033 |              17267 |                  1
 pgbench_accounts | vacuuming heap |           18033 |             18033 |              17997 |                  1
 pg_language | cleaning up indexes |               1 |                 1 |                  1 |                  0
 pg_tablespace | scanning heap |               1 |                 0 |                  0 |                  0

ステータスが、scanning heap → vacuuming indexes → vacuuming heap という具合に変更していくのが見える。