他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

VACUUM

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 [ boolean ]
    TRUNCATE [ boolean ]
    PARALLEL integer


table_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では、テーブルの内容全体を新しいディスクファイルに領域を余すことなく書き換えるため、オペレーティングシステムに未使用の領域を返すことができます。 この形式では、実行速度がかなり低速になります。また、処理中のテーブルに対する排他的ロックが必要になります。

オプションリストが括弧でくくられていた場合、オプションを任意の順序で記述することができます。 括弧がないと、オプションは上で示した通りの順番で指定しなければなりません。 括弧付きの構文は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に、無効なタプルを指しているインデックスのエントリーの削除を試みるよう指定します。 これは普通は望まれる振舞いであり、バキュームされるテーブルに対してvacuum_index_cleanupオプションが偽に設定されていない限りデフォルトです。 このオプションを偽に設定するのは、バキュームの実行をできる限り速くする必要がある場合には有用かもしれません。例えば、切迫したトランザクションIDの周回を避ける場合です(24.1.5を参照してください)。 しかしながら、インデックスの掃除を定期的に行なわない場合、テーブルが修正されるに従い、インデックスは無効なタプルを蓄積し、テーブル自身もインデックスの掃除が完了するまで削除できない無効な行ポインタを蓄積していきますので、パフォーマンスは悪くなるでしょう。 このオプションはインデックスを持たないテーブルには影響せず、FULLオプションが使われていれば無視されます。

TRUNCATE

VACUUMに、テーブルの最後にある空のページを切り詰め、切り詰めたページのディスクスペースをオペレーティングシステムに返すよう指定します。 これは普通は望まれる振舞いであり、バキュームされるテーブルに対してvacuum_truncateオプションが偽に設定されていない限りデフォルトです。 このオプションを偽に設定するのは、切り詰めが要求されているテーブルのACCESS EXCLUSIVEロックを回避するのに有用かもしれません。 このオプションはFULLオプションが使われていれば無視されます。

PARALLEL

integer個のバックグラウンドワーカーを使用して、VACUUMのインデックスバキュームフェーズとインデックスクリーンアップフェーズを並列に実行します(各バキュームフェーズの詳細については、表 27.37を参照してください)。 操作の実行に使用されるワーカーの数は、並列バキュームをサポートするリレーションのインデックスの数と同じです。この数はPARALLELオプションで指定されたワーカーの数によって制限され、max_parallel_maintenance_workersパラメータによってさらに制限されます。 インデックスは、インデックスのサイズがmin_parallel_index_scan_sizeパラメータよりも大きい場合にのみ、並列バキュームに参加できます。 integerで指定されたパラレルワーカー数が実行中に使用されることは保証されないことに注意してください。 指定されたワーカー数より少ないワーカーでバキュームが実行されたり、ワーカーがまったくない状態で実行される可能性があります。 1つのインデックスに使用出来るワーカーは1つだけです。よって、パラレルワーカーはテーブルに少なくとも2つのインデックスがある場合にのみ起動されます。 バキュームのワーカーは、各フェーズの開始前に起動され、フェーズの終了時に終了します。 これらの動作は将来のリリースで変更される可能性があります。このオプションはFULLオプションと一緒に使用することはできません。

boolean

選択されたオプションを有効にするか無効にするかを指定します。 オプションを有効にするにはTRUEONまたは1と書くことができ、無効にするにはFALSEOFFまたは0と書くことができます。 boolean値は省略することもでき、その場合にはTRUEとみなされます。

integer

選択したオプションに渡される負でない整数値を指定します。

table_name

バキューム対象のテーブルまたはマテリアライズドビューの名前です(スキーマ修飾名も可)。 指定したテーブルがパーティションテーブルの場合、そのすべてのリーフパーティションがバキュームされます。

column_name

解析の対象とする列名です。 デフォルトは全列です。 列リストが指定された場合はANALYZEも指定しなければいけません。

出力

VERBOSEが指定された場合、VACUUMは、現在処理中のテーブルを示す進行状況メッセージを表示します。 同様に、テーブルについての各種の統計情報も表示されます。

注釈

テーブルをバキュームするためには、通常はテーブルの所有者もしくはスーパーユーザでなければなりません。 しかしデータベースの所有者は共有カタログを除くデータベース内の全テーブルをバキュームすることができます。 (共有カタログに関する制限は、データベース全体のVACUUMはスーパーユーザのみが実行可能であることを意味します。) VACUUMは、呼び出したユーザがバキュームするための権限を持たないテーブルはすべて飛ばします。

トランザクションブロック内でVACUUMを実行することはできません。

GINインデックスを持つテーブルでは、VACUUM(全構文)は待ち状態のインデックス挿入を主GINインデックス構造内の適切なところに移動させることにより、待ち状態のインデックス挿入をすべて完了させます。 66.4.1を参照してください。

不要となった行を削除するため、実運用状態のデータベースに対しては定期的に(少なくとも毎晩)VACUUMを実行することを推奨します。 また、テーブルに対して多数の行を追加/削除した後は、そのテーブルにVACUUM ANALYZEを発行することを推奨します。 これによりシステムカタログに最近なされた全ての変更が反映されることになり、PostgreSQLの問い合わせプランナが、問い合わせ計画の作成時により良い選択をできるようになります。

FULLオプションを日常的に使用することは推奨しませんが、特殊なケースでは有用となる場合もあります。 例えば、テーブル内のほとんど全ての行を削除または更新し、そのテーブルによるディスクの使用量を物理的に縮小させて高速なテーブルスキャンを行いたい場合です。 VACUUM FULLはたいていの場合、通常のVACUUMよりもテーブルを縮小します。

PARALLELオプションはバキュームの用途でのみ使用されます。 このオプションをANALYZEオプションで指定した場合、ANALYZEには影響しません。

VACUUMによりI/Oトラフィックがかなり増大しますので、実行中の他のセッションの性能が悪化する可能性があります。 このため、コストベースのバキューム遅延機能の使用が推奨される場合があります。 並列バキュームの場合、各ワーカーはそのワーカーが行った作業に比例してスリープします。 詳細は19.4.4を参照してください。

PostgreSQLには、バキューム保守作業を自動化するautovacuum機能があります。 自動バキューム処理および手作業によるバキューム処理に関する詳細については、24.1を参照してください。

onek というテーブル1つだけを掃除し、オプティマイザ用に解析し、バキューム処理の詳細な報告を出力するには、次のようにします。

VACUUM (VERBOSE, ANALYZE) onek;

互換性

標準SQLにはVACUUM文はありません。

関連項目

vacuumdb, 19.4.4, 24.1.6