この記事では、VACUUMの概要、構文、および例を紹介します。
説明
VACUUMは、デッドタプルによって占有されたストレージを回収します。 通常のPolarDB操作では、更新によって削除または廃止されたタプルはテーブルから物理的に削除されません。VACUUMが完了するまで存在します。 したがって、特に頻繁に更新されるテーブルでは、VACUUMを定期的に実行する必要があります。
table_and_columnsリストがない場合、VACUUMは、現在のユーザーがバキューム権限を持っている現在のデータベース内のすべてのテーブルとマテリアライズドビューを処理します。 リストでは、VACUUMはそれらのテーブルのみを処理します。
VACUUM ANALYZEは、選択した各テーブルに対してVACUUMを実行し、次にANALYZEを実行します。 これは、定期的なメンテナンススクリプトの便利な組み合わせフォームです。 処理の詳細については、ANALYZEを参照してください。
プレーンVACUUM (FULLなし) は、単にスペースを再利用し、再利用できるようにします。 この形態のコマンドは、排他的ロックが得られないので、テーブルの通常の読み取りおよび書き込みと並行して動作することができる。 ただし、余分なスペースはオペレーティングシステムに返されません (ほとんどの場合) 。同じテーブル内で再利用できるようになっているだけです。 また、インデックスを処理するために複数のCPUを活用することもできます。 この特徴は、平行真空として知られている。 この機能を無効にするには、PARALLELオプションを使用し、並列ワーカーをゼロとして指定します。 VACUUM FULLは、テーブルの内容全体を余分なスペースなしで新しいディスクファイルに書き換え、未使用のスペースをオペレーティングシステムに戻すことができます。 このフォームははるかに遅く、処理中に各テーブルにACCESS EXCLUSIVEロックが必要です。
オプションリストが括弧で囲まれている場合、オプションは任意の順序で記述できます。
概要
VACUUM [ ( option [, ...] ) ] [table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [分析] [ table_and_columns [, ...] ]]
ここで、オプションは次のいずれかになります。
FULL [ブール値]
FREEZE [ブール値]
VERBOSE [ブール値]
ANALYZE [ブール値]
DISABLE_PAGE_SKIPPING [ブール]
SKIP_LOCKED [ブール値]
INDEX_CLEANUP { AUTO | ON | OFF}
PROCESS_TOAST [ブール値]
TRUNCATE [ブール]
PARALLEL整数
table_and_columnsは次のとおりです。
table_name [ ( column_name [, ...] ) ] パラメーター
フル: 「フル」真空を選択します。これにより、より多くのスペースを取り戻すことができますが、はるかに時間がかかり、テーブルを排他的にロックします。 このメソッドは、テーブルの新しいコピーを書き込み、操作が完了するまで古いコピーを解放しないため、余分なディスクスペースも必要になります。 通常、これは、テーブル内からかなりの量のスペースを再利用する必要がある場合にのみ使用する必要があります。フリーズ: タプルの積極的な「フリーズ」を選択します。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はすべてのパーティションをスキップします。INDEEX_CLEANUP: VACUUMがデッドタプルを指すインデックスエントリを削除しようとすることを指定します。 これは通常、クリアするテーブルに対してvacuum_index_cleanupオプションがfalseに設定されていない限り、望ましい動作であり、既定の動作です。 このオプションをfalseに設定すると、clear操作をできるだけ早く実行する必要がある場合に役立ちます。たとえば、ラップアラウンドトランザクションIDが発生するのを防ぐためです。 ただし、インデックスのクリーニングが不規則に実行されると、テーブルが変更されるとインデックスがデッドタプルを蓄積し、テーブル自体がインデックスのクリーニングが完了するまで削除できないデッド行ポインターを蓄積するため、パフォーマンスに影響を与える可能性があります。 このオプションは、インデックスのないテーブルでは無効です。 FULLオプションを使用する場合、このオプションは無視されます。TRUNCATE:VACUUMがテーブルの末尾にある空のページを切り捨て、切り捨てられたページのディスク領域をオペレーティングシステムに返すようにすることを指定します。 これは通常、望ましい動作であり、バキュームされるテーブルに対してvacuum_truncateオプションがfalseに設定されていない限り、デフォルトです。 このオプションをfalseに設定すると、切り捨てに必要なテーブルのACCESS EXCLUSIVEロックを回避できます。FULLオプションが使用されている場合、このオプションは無視されます。PARALLEL:integerバックグラウンドワーカーを使用して、vacuumのインデックスバキュームとインデックスクリーンアップフェーズを並行して実行します。 操作の実行に使用されるワーカーの数は、parallel_maintenance_workersによってさらに制限されるparallelオプションで指定されたワーカーの数によって制限される並列真空をサポートするリレーションのインデックスの数に等しくなります。 インデックスは、インデックスのサイズがmin_parallel_index_scan_sizeより大きい場合に限り、並列真空に参加できます。integerで指定された並列ワーカーの数が実行中に使用されることは保証されません。 真空は、指定された作業員よりも少ない作業員で、または作業員がまったくいなくても実行することができます。 インデックスごとに使用できるワーカーは1つだけです。 したがって、並列ワーカーは、テーブルに少なくとも2のインデックスがある場合にのみ起動されます。 真空のための労働者は、各フェーズの開始前に起動され、フェーズの終わりに終了します。 これらの動作は、将来のリリースで変更される可能性があります。 このオプションは、FULLオプションと一緒には使用できません。boolean: 選択したオプションをオンにするかオフにするかを指定します。 オプションを有効にするにはTRUE、ON、または1と記述し、オプションを無効にするにはFALSE、OFF、または0と記述します。ブール値は省略することもでき、その場合はTRUEと仮定される。integer: 選択したオプションに渡される負でない整数値を指定します。table_name: 特定のテーブルまたはマテリアライズドビューの名前 (オプションでスキーマ修飾) 。 指定されたテーブルがパーティションテーブルの場合、そのすべてのリーフパーティションがバキュームされます。column_name: 分析する特定の列の名前。 デフォルトはすべての列になります。 列リストが指定されている場合は、ANALYZEも指定する必要があります。
出力
VERBOSEを指定すると、VACUUMは現在処理中のテーブルを示す進捗メッセージを出力します。 テーブルに関するさまざまな統計も印刷されています。
注
テーブルを掃除機で掃除するには、通常、テーブルの所有者またはスーパーユーザーである必要があります。 ただし、データベース所有者は、共有カタログを除くデータベース内のすべてのテーブルをバキュームできます。 (共有カタログの制限は、真のデータベース全体のVACUUMがスーパーユーザーによってのみ実行できることを意味します。) VACUUMは、呼び出し元のユーザーに真空処理の権限がないテーブルをスキップします。
VACUUMはトランザクションブロック内では実行できません。
GINindexesを含むテーブルの場合、VACUUM (任意の形式) は、保留中のインデックスエントリをmainGINindex構造の適切な場所に移動することによって、保留中のインデックス挿入も完了します。
デッド行を削除するには、アクティブな本番データベースを頻繁に (少なくとも夜間に) 掃除することをお勧めします。 多数の行を追加または削除した後、影響を受けるテーブルに対してVACUUM ANALYZEコマンドを発行することをお勧めします。 これにより、最近のすべての変更の結果でシステムカタログが更新され、PostgreSQLqueryプランナーがクエリの計画をより適切に選択できるようになります。
FULLオプションは日常的な使用には推奨されませんが、特別な場合には便利です。 例としては、テーブル内のほとんどの行を削除または更新し、テーブルを物理的に縮小して占有するディスク領域を減らし、テーブルスキャンを高速化できるようにする場合があります。 VACUUM FULLは通常、プレーンのVACUUMよりもテーブルを縮小します。
PARALLELオプションは、真空用にのみ使用されます。 このオプションをANALYZEオプションで指定しても、ANALYZEには影響しません。
VACUUMはI/Oトラフィックを大幅に増加させ、他のアクティブセッションのパフォーマンスを低下させる可能性があります。 したがって、コストベースの真空遅延機能を使用することが推奨される場合があります。 平行真空のために、各労働者はその労働者によってなされる仕事に比例して眠る。
PolarDBは、定期的な真空メンテナンスを自動化できる「自動真空」設備を含む。
例
単一のテーブルonekをクリーニングするには、オプティマイザを分析し、詳細な真空アクティビティレポートを印刷します。
VACUUM (バーボーズ、分析) onek;