PostgreSQL VACUUM、VACUUM FULL、ANALYZE、自動バキューム

https://www.postgresql.jp/document/11/html/sql-vacuum.html

データの削除や更新によって不要になったデータ領域を回収する仕組み。
実行には、対象のテーブルやデータベースに対して所有者権限が必要である。

VACUUM

  • VACUUM [FULL] [VERBOSE] [テーブル名]
  • データファイルのサイズは変更されない。
  • テーブルロックを取得しない。
  • インデックスを含むテーブル内の不要領域を回収する 。
  • VERBOSE オプションは、標準エラー出力に結果を出力する。
  • テーブル名を指定しない場合、データベース内のすべてのテーブルが対象になる。
  • VACUUMは一時テーブル(temporary table)を対象とできるが、自動バキュームでは一時テーブルは対象外である。
  • 実行
    • クライアントアプリケーション vacuumdb を実行する。
    • psql でデータベースに接続して VACUUM 文を実行する。

VACUUM FULL

  • VACUUM FULL [テーブル名]
  • ファイルサイズが小さくなる。
  • テーブルロックを取得する。
  • テーブル名を指定しない場合、データベース内のすべてのテーブルが対象になる。
  • 実行
    • クライアントアプリケーション vacuumdb を -f または --full オプションで実行する。
    • psql でデータベースに接続して VACUUM FULL 文を実行する。

ANALYZE

https://www.postgresql.jp/document/11/html/sql-analyze.html

  • ANALYZE [テーブル名(カラム名)]
  • VACUUM ANALYZE;
  • クライアントアプリケーション vacuumdb の -z, --analyze オプションで VACUUM ANALYZE と同じ。

データベースに対する問い合わせの計画を最適化するため、テーブルの内容を解析する。
テーブルのアクセス頻度は計画とは関係ないので、ANALYZEでは収集されない。
テーブル名を指定しなければ、接続先のデータベース内の全テーブルがANALYZEされる。
ANALYZEは自動バキュームの実行時に自動的に実行される。
ANALYZE、VACUUM ANALYZEは排他ロックしない。
テーブルのごく一部のデータをサンプリングして統計情報を計算するので、短時間で処理が終わる。

自動バキューム

  • postgresql.conf
    • autovacuum パラメータを on に設定することで実行される。
  • それぞれのテーブルについて更新量が閾値を超えたときにテーブル単位で VACUUM が実行される。
  • 常時存在する自動バキュームランチャというデーモンから、自動バキュームワーカが定期的に起動されることで実行される。
  • VACUUMとANALYZEを自動的に実行する。
  • VACUUMは一時テーブル(temporary table)を対象とできるが、自動バキュームでは一時テーブルは対象外である。
  • autovacuum_max_workersというパラメータがあり、これで指定した個数を超えるワーカープロセスは起動しないようになってる。