VACUUM — データベースの不要領域の回収とデータベースの解析(オプション)を行う
VACUUM [ (option[, ...] ) ] [table_and_columns[, ...] ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [table_and_columns[, ...] ] ここでoptionは以下の一つであり、 FULL [boolean] FREEZE [boolean] VERBOSE [boolean] ANALYZE [boolean] DISABLE_PAGE_SKIPPING [boolean] SKIP_LOCKED [boolean] INDEX_CLEANUP { AUTO | ON | OFF } PROCESS_MAIN [boolean] PROCESS_TOAST [boolean] TRUNCATE [boolean] PARALLELintegerSKIP_DATABASE_STATS [boolean] ONLY_DATABASE_STATS [boolean] BUFFER_USAGE_LIMITsizetable_and_columnsは以下の通りです。table_name[ (column_name[, ...] ) ]
VACUUM は、無効タプルが使用する領域を回収します。
PostgreSQLの通常動作では、削除されたタプルや更新によって不要となったタプルは、テーブルから物理的には削除されません。
これらのタプルはVACUUMが完了するまで存在し続けます。
そのため、特に更新頻度が多いテーブルでは、VACUUMを定期的に実行する必要があります。
table_and_columnsリストを指定しない場合、VACUUMは現在のユーザがバキュームできる権限を持つ、現在のデータベース内の全てのテーブルとマテリアライズドビューを処理します。
リストを指定した場合、VACUUMは指定したテーブルのみを処理します。
VACUUM ANALYZEは、指定したテーブルの1つひとつに対し、VACUUMを行った後、ANALYZEを行います。
このコマンドの組合わせは、日常的な管理スクリプトで使うと便利です。
処理の詳細に関しては、ANALYZEを参照してください。
(FULLが指定されていない)通常のVACUUMは、単に領域を回収し、そこを再利用可能な状態に変更します。
この形式のコマンドでは排他的ロックを取得しないため、テーブルへの通常の読み書き操作と並行して実行することができます。
しかし余った領域はオペレーティングシステムには(ほとんどの場合)返されません。
同じテーブル内で再利用できるように保持されるだけです。
また、インデックスを処理するために複数のCPUを活用することもできます。
この機能は、並列バキュームとして知られています。
この機能を無効にするには、PARALLELオプションでパラレルワーカーの数をゼロに指定します。
VACUUM FULLでは、テーブルの内容全体を新しいディスクファイルに領域を余すことなく書き換えるため、オペレーティングシステムに未使用の領域を返すことができます。
この形式では、実行速度がかなり低速になります。また、処理中のテーブルに対するACCESS EXCLUSIVEロックが必要になります。
オプションリストが括弧でくくられていた場合、オプションを任意の順序で記述することができます。 括弧がないと、オプションは上で示した通りの順番で指定しなければなりません。 括弧付きの構文はPostgreSQL 9.0で追加されました。 カッコがない構文は廃止予定です。
FULLより多くの領域の回収することができる「完全な」バキュームを選択します。 ただし、通常よりも処理に時間がかかります。 また、テーブルに対する排他ロックが必要です。 またこの方式では、テーブルのコピーを新しく書き出し、操作が終わるまで古いコピーが解放されませんので、余分にディスク領域が必要です。 通常、大きな容量がテーブルから回収されなければならない場合にのみこれが使用されるべきです。
FREEZE
積極的なタプルの「凍結」を選択します。
FREEZE指定は、vacuum_freeze_min_ageおよびvacuum_freeze_table_ageパラメータをゼロとしてVACUUMを実行することと同じです。
テーブルが書き換えられる時は、必ず積極的な凍結が行われるので、FULLが指定されているときは、このオプションは冗長です。
VERBOSE各テーブルについてバキューム処理の詳細な報告を出力します。
ANALYZEプランナが使用する統計情報を更新し、問い合わせを実行する最も効率的な方法を決定できるようにします。
DISABLE_PAGE_SKIPPING
通常、VACUUMは可視性マップに基いてページをスキップします。
すべてのタプルが凍結されていることがわかっているページは、常にスキップできます。
また、すべてのタプルがすべてのトランザクションに対して可視であることがわかっているページは、積極的なバキュームを実行している場合を除き、スキップできます。
さらに、積極的なバキュームを実行している場合を除き、一部のページは、他のセッションがその使用を終了するのを待つのを避けるため、スキップされます。
このオプションは、ページをスキップする動作をすべて無効にします。
これは可視性マップの内容が怪しいときにのみ使用されることを意図したもので、それはデータベースの破損を引き起こすようなハードウェアあるいはソフトウェアの障害がある場合にのみ発生します。
SKIP_LOCKED
VACUUMに、リレーションでの作業開始時、衝突するロックが解放されるのを待たないよう指定します。リレーションが待たずにすぐにロックできない場合、そのリレーションは飛ばされます。
このオプションを指定しても、リレーションのインデックスを開く時にVACUUMはブロックするかもしれないことに注意してください。
さらに加えて、VACUUM ANALYZEは、パーティションやテーブル継承の子、ある種類の外部テーブルからサンプル行を取得する時にブロックするかもしれません。
また、VACUUMは通常、指定されたパーティションテーブルの全パーティションを処理しますが、このオプションが指定されると、パーティションテーブルに衝突するロックがある場合VACUUMは全パーティションを飛ばすようになります。
INDEX_CLEANUP
通常、VACUUMは、テーブル内に無効なタプルがほとんどない場合インデックスのバキュームをスキップします。
テーブルのインデックスをすべて処理するコストは、無効なインデックスタプルを削除した場合にそれにより得られる利益を大きく上回ると考えられます。
このオプションは、無効なタプルが1つ以上ある場合にVACUUMにインデックスを強制的に処理させるのに使えます。
デフォルトはAUTOで、適切な場合VACUUMはインデックスのバキュームをスキップします。
INDEX_CLEANUPがONに設定されていれば、VACUUMは保守的にインデックスから無効なタプルをすべて削除します。
この動作が標準だったPostgreSQLの以前のリリースとの後方互換性のためには、これは有用かもしれません。
INDEX_CLEANUPをOFFに設定して、VACUUMに必ずインデックスのバキュームをスキップするよう強制することもできます。テーブルに多くの無効なタプルがある場合でさえも同様です。
切迫したトランザクションIDの周回を避けるためVACUUMをできる限り速く実行することが必要な場合には、これは有用かもしれません(25.1.5を参照してください)。
しかしながら、たいていはvacuum_failsafe_ageにより制御される周回安全機構がトランザクションIDの周回の失敗を避けるために自動的に発動しますし、そちらの方が好ましいです。
インデックスクリーンアップが定期的に実行されていなければ、テーブルが修正されるに従い、インデックスは無効なタプルを蓄積し、テーブル自身もインデックスクリーンアップが完了するまで削除できない無効な行ポインタを蓄積していきますので、性能は悪化するでしょう。
このオプションはテーブルにインデックスがない場合には効果がありませんし、FULLオプションが使われている場合には無視されます。
トランザクションID周回安全機構にも影響はありません。
発動した場合には、INDEX_CLEANUPがONに設定されていたとしても、インデックスのバキュームをスキップします。
PROCESS_MAIN
VACUUMが主リレーションの処理を試みるよう指定します。
これは普通は望まれる振舞いであり、デフォルトです。
このオプションを偽に設定するのは、リレーションの対応するTOASTテーブルのバキュームのみが必要な場合には有用かもしれません。
PROCESS_TOAST
各リレーションに対応するTOASTテーブルが存在するのなら、VACUUMがその処理を試みるよう指定します。
これは普通は望まれる振舞いであり、デフォルトです。
このオプションを偽に設定するのは、主リレーションをバキュームすることだけが必要な場合には有用かもしれません。
FULLオプションを使うときにはこのオプションが必要です。
TRUNCATE
VACUUMに、テーブルの最後にある空のページを切り詰め、切り詰めたページのディスクスペースをオペレーティングシステムに返すよう指定します。
これは普通は望まれる振舞いであり、バキュームされるテーブルに対してvacuum_truncateオプションが偽に設定されていない限りデフォルトです。
このオプションを偽に設定するのは、切り詰めが要求されているテーブルのACCESS EXCLUSIVEロックを回避するのに有用かもしれません。
このオプションはFULLオプションが使われていれば無視されます。
PARALLEL
integer個のバックグラウンドワーカーを使用して、VACUUMのインデックスバキュームフェーズとインデックスクリーンアップフェーズを並列に実行します(各バキュームフェーズの詳細については、表 28.45を参照してください)。
操作の実行に使用されるワーカーの数は、並列バキュームをサポートするリレーションのインデックスの数と同じです。この数はPARALLELオプションで指定されたワーカーの数によって制限され、max_parallel_maintenance_workersパラメータによってさらに制限されます。
インデックスは、インデックスのサイズがmin_parallel_index_scan_sizeパラメータよりも大きい場合にのみ、並列バキュームに参加できます。
integerで指定されたパラレルワーカー数が実行中に使用されることは保証されないことに注意してください。
指定されたワーカー数より少ないワーカーでバキュームが実行されたり、ワーカーがまったくない状態で実行される可能性があります。
1つのインデックスに使用出来るワーカーは1つだけです。よって、パラレルワーカーはテーブルに少なくとも2つのインデックスがある場合にのみ起動されます。
バキュームのワーカーは、各フェーズの開始前に起動され、フェーズの終了時に終了します。
これらの動作は将来のリリースで変更される可能性があります。このオプションはFULLオプションと一緒に使用することはできません。
SKIP_DATABASE_STATS
VACUUMが、最も古い凍結されていないXIDに関するデータベース全体の統計情報の更新をスキップするように指定します。
通常、VACUUMはこれらの統計情報をコマンドの終わりに一度更新します。
ただし、非常に数多くのテーブルを持つデータベースでは、これには時間がかかる可能性があり、最も古い凍結されていないXIDを含むテーブルがバキュームされたテーブルの中にない限り、何も達成されません。
さらに、複数のVACUUMコマンドが並列に発行された場合、一度にデータベース全体の統計処理を更新できるのはそのうちの1つだけです。
したがって、アプリケーションが多くのVACUUMコマンドを連続して発行しようとする場合、このオプションを最後のコマンドを除くすべてのコマンドに設定するか、すべてのコマンドに設定して後で個別にVACUUM (ONLY_DATABASE_STATS)を発行すると便利でしょう。
ONLY_DATABASE_STATS
VACUUMが、最も古い凍結されていないXIDについて、データベース全体の統計情報を更新する以外に何もしないことを指定します。
このオプションを指定する場合、table_and_columnsリストは空である必要があり、VERBOSE以外の他のオプションは有効にできません。
BUFFER_USAGE_LIMIT
VACUUMのバッファアクセスストラテジリングバッファサイズを指定します。
このサイズは、このストラテジの一部として再利用される共有バッファの数を計算するために使用されます。
0は、バッファアクセスストラテジの使用を無効にします。
ANALYZEも指定されている場合、BUFFER_USAGE_LIMIT値がバキュームと解析の両方のステージに使用されます。
ANALYZEも指定されている場合を除き、このオプションはFULLオプションとともに使用できません。
このオプションが指定されていない場合、VACUUMはvacuum_buffer_usage_limitの値を使用します。
設定を高くするとVACUUMの実行速度がより速くなりますが、設定が大き過ぎると、とても多くの他の有用なページが共有バッファから追い出されてしまう可能性があります。
最小値は 128 kB、最大値は 16 GBです。
boolean
選択されたオプションを有効にするか無効にするかを指定します。
オプションを有効にするにはTRUE、ONまたは1と書くことができ、無効にするにはFALSE、OFFまたは0と書くことができます。
boolean値は省略することもでき、その場合にはTRUEとみなされます。
integer選択したオプションに渡される負でない整数値を指定します。
size
メモリの量をキロバイト単位で指定します。
サイズは、数値のサイズに続いて、B(バイト)、kB(キロバイト)、MB(メガバイト)、GB(ギガバイト)またはTB(テラバイト)のいずれか1つのメモリ単位を含む文字列として指定することもできます。
table_nameバキューム対象のテーブルまたはマテリアライズドビューの名前です(スキーマ修飾名も可)。 指定したテーブルがパーティションテーブルの場合、そのすべてのリーフパーティションがバキュームされます。
column_name
解析の対象とする列名です。
デフォルトは全列です。
列リストが指定された場合はANALYZEも指定しなければいけません。
VERBOSEが指定された場合、VACUUMは、現在処理中のテーブルを示す進行状況メッセージを表示します。
同様に、テーブルについての各種の統計情報も表示されます。
テーブルをバキュームするためには、通常はテーブルの所有者もしくはスーパーユーザでなければなりません。
しかしデータベースの所有者は共有カタログを除くデータベース内の全テーブルをバキュームすることができます。
(共有カタログに関する制限は、データベース全体のVACUUMはスーパーユーザのみが実行可能であることを意味します。)
VACUUMは、呼び出したユーザがバキュームするための権限を持たないテーブルはすべてスキップします。
トランザクションブロック内でVACUUMを実行することはできません。
GINインデックスを持つテーブルでは、VACUUM(全構文)は待ち状態のインデックス挿入を主GINインデックス構造内の適切なところに移動させることにより、待ち状態のインデックス挿入をすべて完了させます。
70.4.1を参照してください。
無効な行を削除するために、データベースすべてを定期的にバキュームすることをお勧めします。 PostgreSQLには、バキューム保守作業を自動化する「autovacuum」機能があります。 自動バキューム処理および手作業によるバキューム処理に関する詳細については、25.1を参照してください。
FULLオプションを日常的に使用することは推奨しませんが、特殊なケースでは有用となる場合もあります。
例えば、テーブル内のほとんど全ての行を削除または更新し、そのテーブルによるディスクの使用量を物理的に縮小させて高速なテーブルスキャンを行いたい場合です。
VACUUM FULLはたいていの場合、通常のVACUUMよりもテーブルを縮小します。
PARALLELオプションはバキュームの用途でのみ使用されます。
このオプションをANALYZEオプションで指定した場合、ANALYZEには影響しません。
VACUUMによりI/Oトラフィックがかなり増大しますので、実行中の他のセッションの性能が悪化する可能性があります。
このため、コストベースのバキューム遅延機能の使用が推奨される場合があります。
並列バキュームの場合、各ワーカーはそのワーカーが行った作業に比例してスリープします。
詳細は20.4.4を参照してください。
VACUUMをFULLオプションなしで実行している各バックエンドはその進捗をpg_stat_progress_vacuumビューで報告します。
VACUUM FULLを実行しているバックエンドはその代わりにその進捗をpg_stat_progress_clusterビューで報告します。
詳細は28.4.5と28.4.2を参照してください。
onek というテーブル1つだけを掃除し、オプティマイザ用に解析し、バキューム処理の詳細な報告を出力するには、次のようにします。
VACUUM (VERBOSE, ANALYZE) onek;
標準SQLにはVACUUM文はありません。