VACUUM
指定されたテーブルまたは現在のデータベース内のすべてのテーブルで、行を再ソートしてスペースを再利用します。
注記
必要なテーブルのアクセス許可を持つユーザーのみが、テーブルにバキューム処理を効果的に行うことができます。必要なテーブルアクセス許可なしで VACUUM が実行された場合、オペレーションは完了しますが、効果はありません。VACUUM を効果的に実行するのに有効なテーブルアクセス許可のリストについては、「必要な権限」セクションを参照してください。
Amazon Redshift は、背景で自動的にデータをソートし、VACUUM DELETE を実行します。これにより、VACUUM コマンドを実行する必要が少なくなります。詳細については、「テーブルのバキューム処理」を参照してください。
デフォルトではVACUUM コマンドで、テーブルの行の 95 パーセント以上がすでにソートされているテーブルのソートフェーズをスキップします。ソートフェーズをスキップすることにより、VACUUM のパフォーマンスが大幅に向上します。1 つのテーブルのデフォルトのソートあるいは削除しきい値を変更するには、VACUUM を実行するときに、テーブル名および TO threshold PERCENT パラメータを含めます。
ユーザーは、バキューム処理中のテーブルにアクセスできます。バキューム処理中のテーブルにクエリおよび書き込み操作を実行できますが、データ操作言語 (DML) コマンドおよびバキュームを同時に実行すると両方の処理時間が長くなる可能性があります。バキューム処理中に UPDATE および DELETE ステートメントを実行する場合は、システムのパフォーマンスが低減する場合があります。VACUUM DELETE は、更新操作と削除操作を一時的にブロックします。
Amazon Redshift は、バックグラウンドで自動的に DELETE ONLY vacuum を実行します。ユーザーが ALTER TABLE などのデータ定義言語 (DDL) 操作を実行すると、自動バキューム操作は一時停止します。
注記
Amazon Redshift の VACUUM コマンドの構文と動作は、PostgreSQL の VACUUM 操作とは大幅に異なります。例えば、Amazon Redshift でのデフォルトの VACUUM 操作は VACUUM FULL です。これは、ディスク領域を再利用し、すべての行を再ソートします。これに対して、PostgreSQL のデフォルトの VACUUM 操作は、単純に領域を再利用し、再び使用できるようにするだけです。
詳細については、「テーブルのバキューム処理」を参照してください。
必要な権限
以下に、VACUUM に必要な権限を示します。
スーパーユーザー
VACUUM の権限を持つユーザー
テーブルの所有者
テーブルの共有先であるデータベース所有者
構文
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ] [ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
パラメータ
- FULL
-
指定されたテーブル (または現在のデータベースのすべてのテーブル)をソートし、直前の UPDATE 操作および DELETE 操作で削除対象のマークが付けられた行によって占有されているディスク領域を再利用します。VACUUM FULL がデフォルトです。
完全バキュームは、インターリーブテーブルのインデックスを再作成しません。インターリーブテーブルのインデックスを再作成するには、VACUUM REINDEXオプションを使用します。
デフォルトで、VACUUM FULL は、少なくとも 95 パーセントがソート済みであるテーブルのソートフェーズをすべてスキップします。VACUUM がソートフェーズをスキップできれば、DELETE ONLY を実行し、削除フェーズで残りの行の少なくとも 95 パーセントが削除対象としてマークされていない領域を再利用します。
ソートしきい値に達しておらず (例えば 90 パーセントの行がソートされていて) VACUUM が完全ソートを実行する場合は、完全な削除オペレーションも実行され、削除された行のスペースが 100 パーセント回復されます。
一つのテーブルに対してのみデフォルトの VACUUM しきい値を変更できます。1 つのテーブルのデフォルトの VACUUM しきい値を変更するには、テーブル名および TO threshold PERCENT パラメータを含めます。
- SORT ONLY
-
削除した行によって解放されたスペースを再利用せずに、指定されたテーブル (または現在のデータベース内のすべてのテーブル) をソートします。このオプションは、ディスク容量の再利用が重要でなく、新しい行の再ソートが重要な場合に役に立ちます。ソートされていない領域が削除済みの行が大量に含んでおらず、ソート済み領域全体にまたがっていない場合に、SORT ONLY のバキューム操作を実行すると、バキューム操作にかかる時間が短縮されます。ディスク容量による拘束がなく、テーブルの行を常にソート状態に維持するクエリの最適化に依存するアプリケーションは、このようなバキューム操作からメリットを得ることができます。
デフォルトで、VACUUM SORT ONLY は少なくとも 95 パーセントがソート済みであるテーブルをスキップします。1 つのテーブルのデフォルトのソートしきい値を変更するには、VACUUM を実行するときに、テーブル名および TO threshold PERCENT パラメータを含めます。
- DELETE ONLY
-
Amazon Redshift はバックグラウンドで自動的に DELETE ONLY vacuum を実行するため、DELETE ONLY vacuum を実行する必要は、ほとんどの場合ありません。
VACUUM DELETE は、直前の UPDATE 操作と DELETE 操作で削除対象のマークが付けられた行によって占有されているディスク容量を回収し、テーブルを圧縮して、消費されている領域を解放します。DELETE ONLY バキューム操作を実行しても、テーブルのデータはソートされません。
このオプションは、ディスク容量が重要で、新しい行の再ソートが重要でない場合に、バキューム操作にかかる時間を短縮します。このオプションは、クエリのパフォーマンスが既に最適で、行の再ソートのためにクエリのパフォーマンスを最適化する必要がない場合にも役立ちます。
デフォルトでは、VACUUM DELETE ONLY は、残りの行の少なくとも 95 パーセントが削除対象としてマークされていない領域を再利用します。1 つのテーブルのデフォルトの削除しきい値を変更するには、VACUUM を実行するときに、テーブル名および TO threshold PERCENT パラメータを含めます。
一部のオペレーション (
ALTER TABLE APPEND
など) により、テーブルは断片化される場合があります。DELETE ONLY
句を使用すると、バキュームオペレーションにより、断片化されたテーブルから領域が解放されます。しきい値として同じ 95 パーセントが最適化オペレーションに適用されます。 - REINDEX tablename
-
インターリーブソートキー列の値の分散を分析した後、完全バキューム処理を実行します。REINDEX を使用する場合は、テーブル名が必要です。
VACUUM REINDEX は、インターリーブソートキーを分析する目的で追加パスを作成するため、VACUUM FULL よりも大幅に実行時間が長くなります。インターリーブテーブルでは、ソート操作およびマージ操作の時間が長くなる場合があります。これは、インターリーブソートでは、複合ソートよりも多くの行の再調整が必要になる可能性があるためです。
VACUUM REINDEX 操作がその完了前に終了した場合、次の VACUUM は完全バキューム操作の実行前に REINDEX 操作を再開します。
VACUUM REINDEX は TO threshold PERCENT ではサポートされいません。
- table_name
-
バキューム操作を実行するテーブルの名前。テーブル名を指定しない場合、バキューム操作は現在のデータベースのすべてのテーブルに適用されます。ユーザーが作成した常設テーブルまたは一時テーブルを指定できます。このコマンドは、ビューやシステムテーブルなど、他のオブジェクトに対しては意味を持ちません。
TO threshold PERCENT パラメータを含める場合は、テーブル名が必要です。
- RECLUSTER tablename
-
テーブルのソートされていない部分をソートします。自動テーブルソートによってすでにソートされているテーブルの一部はそのまま残ります。このコマンドは、新しくソートされたデータをソート済みの領域とマージしません。また、削除対象としてマークされたすべての領域が、再利用されるわけではありません。このコマンドの完了後、テーブルが完全にソートされない状態で、SVV_TABLE_INFO の
unsorted
フィールドに表示されることがあります。大規模なテーブルにおいて、取り込み頻度が高かったり最新のデータのみにアクセスするクエリを実行する場合には、VACUUM RECLUSTER を使用することをお勧めします。
VACUUM RECLUSTER は TO threshold PERCENT ではサポートされていません。RECLUSTER を使用する場合は、テーブル名が必要です。
VACUUM RECLUSTER は、インターリーブソートキーを使用する、分散スタイルが ALL に指定されたテーブルではサポートされません。
- table_name
-
バキューム操作を実行するテーブルの名前。ユーザーが作成した常設テーブルまたは一時テーブルを指定できます。このコマンドは、ビューやシステムテーブルなど、他のオブジェクトに対しては意味を持ちません。
- TO threshold PERCENT
-
VACUUM が削除フェーズをスキップする最低のしきい値、および削除フェーズでスペースを再利用する対象となるしきい値を指定する句です。ソートしきい値は、バキューム処理の前の指定されたテーブルにおけるソート済みの行の合計の割合です。 削除しきい値は、バキューム処理後に削除対象としてマークされていない行の合計の最低割合です。
VACUUM は、テーブルのソート済みの行の割合がソートしきい値以下の場合のみ行を再ソートするため、Amazon Redshift は、バキューム処理の時間を大幅に削減できます。同様に、VACUUM は削除対象としてマークされた行のスペースを 100 パーセント再利用するよう制約を受けない場合、削除対象としてマークされた行を数行のみ含むブロックの書き換えをスキップできます。
たとえば、しきい値に 75 を指定すると、テーブルの行の 75 パーセント以上がすでにソート済みの場合、VACUUM はソートフェーズをスキップします。削除フェーズでは、バキューム処理後に削除対象としてマークされていない行がテーブルに 少なくとも 75 パーセントあるようなテーブルを VACUUM はディスク領域の再利用の対象として設定します。しきい値の値は、0 から 100 の間の整数でなければなりません。デフォルトは 95 です。100 という値を指定すると、VACUUM はすでに完全にソートされていない限り常にテーブルをソートし、削除対象としてマークされたすべての行のスペースを再利用します。0 という値を指定すると、VACUUM は一切テーブルをソートせず、一切スペースを再利用しません。
TO threshold PERCENT パラメータを含める場合は、テーブルの名前も指定する必要があります。テーブル名を省略すると、VACUUM は失敗します。
TO threshold PERCENT パラメータは REINDEX と併用できません。
- BOOST
-
使用可能なメモリやディスク容量などの追加のリソースを使用して VACUUM コマンドを実行します。BOOST オプションを使用して、VACUUM は 1 つのウィンドウで動作し、VACUUM 操作の期間の同時削除や更新をブロックします。BOOST オプションを使用して実行すると、システムリソースのために競合するので、クエリパフォーマンスに影響する場合があります。VACUUM BOOST は、メンテナンスオペレーションの間など、システムのロードが少ない場合に実行します。
BOOST オプションを使用する際は、以下を考慮します。
-
BOOST を指定した場合は、table_name 値が必要です。
-
BOOST は REINDEX でサポートされていません。
-
BOOST は DELETE ONLY で無視されます。
-
使用に関する注意事項
ほとんどの Amazon Redshift アプリケーションでは、完全バキュームをお勧めします。詳細については、「テーブルのバキューム処理」を参照してください。
バキューム操作を実行する前に、以下の動作に注意してください。
-
トランザクションブロック (BEGIN ... END) 内で VACUUM を実行することはできません。トランザクションの詳細については、「直列化可能分離」を参照してください。
-
一度にクラスターで実行できる VACUUM コマンドは 1 つだけです。複数のバキューム動作を同時に実行しようとすると、Amazon Redshift はエラーを返します。
-
テーブルのバキュームを実行すると、ある程度のテーブル容量の増加が発生することがあります。再利用の対象となる削除済みの行が存在しない場合や、テーブルの新しいソート順によりデータ圧縮率が低下する場合、これは想定される動作です。
-
バキューム操作の実行中、クエリのパフォーマンスがある程度低下することが予想されます。バキューム操作が終了すると直ちに通常のパフォーマンスに戻ります。
-
バキュームオペレーション中にも、同時実行書き込みオペレーションは進行しますが、バキューム中の書き込みオペレーションの実行は推奨されていません。バキューム操作を実行する前に、書き込み操作を終了する方がより効率的です。また、バキューム操作開始後に書き込まれたすべてのデータは、その操作でバキュームすることができません。その場合は 2 回目のバキューム操作が必要です。
-
ロード操作または挿入操作が既に進行中の場合、バキューム操作を開始できないことがあります。バキューム操作を開始するには、テーブルへの一時的な排他アクセスが必要になります。この排他アクセスは短時間しか必要でないため、バキューム操作により同時ロードと同時挿入が長時間ブロックされることはありません。
-
特定のテーブルに対して実行する作業がない場合、バキューム操作はスキップされます。ただし、操作がスキップ可能かどうかの検出に関連して、ある程度のオーバーヘッドが発生します。テーブルがあまり使われていないことが判明している場合、または、バキュームのしきい値を満たさないことが判明している場合は、これに対してバキューム操作を実行しないでください。
-
小さなテーブルに対して DELETE ONLY バキューム操作を実行した場合、データの保存に使われるブロック数が減少しないことがあります。特にテーブルに多数の列が存在している場合、またはクラスターがノードごとに多数のスライスを使用している場合、この傾向が顕著になります。このようなバキューム操作はテーブルへの同時挿入を実現するため、1 列ごとに 1 ブロックを各スライスに追加します。また、このようなオーバーヘッドが発生した場合、ブロック数の削減の方が再利用されるディスク容量を上回る可能性があります。例えばバキューム操作前に、8 ノードクラスター上の 10 列のテーブルが 1000 ブロックを占有している場合、削除された行が原因で 80 ブロックを超えるディスク容量が再利用されない限り、バキュームを実行しても実際のブロック数は減少しません。(各データブロックは 1 MB 使用します。)
次のいずれかの条件が満たされると、自動バキューム操作は一時停止します。
-
ユーザーが ALTER TABLE などのデータ定義言語 (DDL) 操作を実行します。この操作では、現在自動バキューム処理が行われている表に対して排他ロックが必要です。
-
ユーザーはクラスター内の任意のテーブルで VACUUM をトリガーします (一度に実行できる VACUUM は 1 つのみ)。
-
クラスター負荷が高い期間。
例
すべてのテーブルで、デフォルトのバキュームしきい値 95 パーセントに基づいて、容量とデータベースの再利用と行の再ソートを実行します。
vacuum;
SALES テーブルで、デフォルトのしきい値 95 パーセントに基づいて、容量の再利用と行の再ソートを実行します。
vacuum sales;
SALES テーブルで、常に容量の再利用と行の再ソートを実行します。
vacuum sales to 100 percent;
SALES テーブルで、すでにソートされている行が 75 パーセント未満の場合のみ、行の再ソートを実行します。
vacuum sort only sales to 75 percent;
バキューム処理後に削除対象としてマークされていない行が残りの行の 少なくとも 75 パーセント以上である SALES テーブルで容量の再利用を実行します。
vacuum delete only sales to 75 percent;
LISTING テーブルのインデックスを再作成した後、バキューム処理を実行します。
vacuum reindex listing;
次のコマンドはエラーを返します。
vacuum reindex listing to 75 percent;
LISTING テーブルのインデックスを再クラスターした後、バキューム処理を実行します。
vacuum recluster listing;
LISTING テーブルを再クラスターしてから、BOOST オプションを使用し、バキューム処理を実行します。
vacuum recluster listing boost;