【PostgreSQL】pg_repackとvacuum full

pg-repackはテーブルの再編成を行えるPostgreSQLの拡張ツール
VACUUM FULLはテーブルの排他ロックがかかり、実行に長い時間がかかる
pg-replackは短い間しか排他ロックをかけないため、リリース戦略としては有効

pg_repackの再編成の種類
– オンラインCLUSTER(テーブルデータを物理的にINDEX順で並び替え)
– 指定カラムでレコードを並び替える
– オンラインVACUUM FULL(レコードの隙間を詰める)
– 指定テーブルのインデックス再構築・再配置

pg_repack

postgres=# \dn
List of schemas
Name | Owner
——–+———-
bank1 | postgres
bank2 | postgres
public | postgres
(3 rows)

スキーマ全体にcluster, vacuum full
postgres=# pg_repack bank1
カラムを指定してレコードを並び替え
pg_repack -o role_id -t user test_schema
pg_repack -o role_id,id -t user test_schema
テーブルを指定してVACUUM FULLを実行
pg_repack -n -t foo test_schema
pg_repack -n -t foo -t bar test_schema
pg_repack -x -t users test_schema

PostgreSQLが追記型アーキテクチャとなっているためファイルサイズが大きくなると肥大化する
auto vaccumがonになっている

VACUUM FULL, REINDEXは気軽に実行できない
VACUUM FULL実行中は排他ロックがかかるのでテーブル参照処理もできなくなる
pg_repackは排他ロックを瞬間的にだけ掛けて、必要最小限だけのロックとなるため、参照・更新処理が実施できる