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 という具合に変更していくのが見える。