5.5 バキューム処理

PostgresSQLは、表のデータを更新したときに元のデータを直接書き換えるのではなく、新たなデータを追加する追記型アーキテクチャを採用しています。そのため、データの更新と削除が繰り返されると表の中の空き領域が増加して性能が低下します。バキューム処理は、この空き領域を回収して再利用可能にします。この処理は自動で行われますが、手動で行うこともできます。

vacuumdbコマンド

vacuumdbは、PostgreSQLデータベースの不要領域のクリーンアップを行うとともに、問い合わせオプティマイザが使用する内部的な統計情報も生成します。形式は以下の通りです。

vacuumdb [オプション] [データベース名]
  • データベース名は、バキュームするデータベースの名前です。省略時は、接続しているユーザ名になります。
  • オプションは、サーバへの接続情報とバキューム方法に関するオプションです。主なものを以下に示すます。
オプション 省略値 説明
--host= (-h) Unixドメインソケット サーバを実行しているマシンのホスト名
またはUnixドメインソケットのディレクトリ
--port= (-p) 5432 サーバが接続監視を行っているTCPポート
--username= (-U) OSのユーザ名 接続するユーザの名前
--all (-a)   バキュームの対象はすべてのデータベース
--dbname= (-d)   バキュームするデータベースの名前
--full (-f)   行の物理的な移動を伴う完全なバキュームを実行
--table= (-t) すべての表 バキュームする表の名前、複数指定が可能
--analyze (-z)   オプティマイザが使用する統計情報も生成
--verbose (-v)   処理中に詳細な情報を表示
--version (-V)   vacuumdbのバージョンを表示して終了
--help (-?)   vacuumdbに関するヘルプを表示して終了


例えば、ossdbデータベースのバキュームを行う場合は、以下のように指定します。

vacuumdb --analyze ossdb

データベースのバキュームとオプティマイザ用の解析の両方が行われます。

VACUUM文

VACUUM文は、vacuumdbコマンドとほぼ同じ機能を持つSQL文です。形式は以下の通りです。

VACUUM [(オプション [, ...])] [表名 [, ...]]
  • 表名は、バキュームする表の名前です。省略時はすべての表がバキュームされます。
  • オプションは複数指定でき、以下のものがあります。
    FULL --- 完全なバキュームを実行
    ANALYZE --- オプティマイザが使用する統計情報も生成
    VERBOSE --- 処理中に詳細な情報を表示

以下は、バキュームする表を指定したVACUUM文の例です。

VACUUM (ANALYZE, VERBOSE) prod, orders;

上記は、prod表とorders表をバキュームします。

ANALYZE文

ANALYZE文は、データベース内の表に関する統計情報を収集します。形式は以下の通りです。

ANALYZE [(オプション [, ...])] [表名]
  • 表名は、統計情報を収集する表の名前です。省略時はすべての表から収集されます。
  • オプションは複数指定でき、以下のものがあります。
    VERBOSE --- 処理中に詳細な情報を表示
    SKIP_LOCKED --- ロックされた表をスキップ