メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

Vacuum Column Limit Exceeded エラー

ERROR: 1036 DETAIL: Vacuum column limit exceeded というメッセージでバキュームに失敗する場合は、VACUUM で使用可能なメモリを使って処理できる分より多くの列がテーブルに含まれています。バキューム列の制限は、テーブルの列の最大数 (1,600) 未満です。実際のバキュームの列の制限はクラスタの設定に応じて異なります。たとえば、DS1 または DC1 ノードタイプのクラスターの場合、通常は最大約 500 列までテーブルのバキューム処理を実行できます。DS2 ノードタイプの場合、この制限は DS2.xlarge クラスターで最大 750 列、DS2.8xlarge クラスターで 1,000 列とすることができます。

wlm_query_slot_count の値を増やすことでバキューム列の制限を緩和できます。この値を増やすと、クエリで使用可能なメモリの量が増えます。wlm_query_slot_count の最大値はキューの同時実行値に制限されます。詳細については、「クエリの設計のベストプラクティス」を参照してください。

wlm_query_slot_count の値を引き上げることができない場合や、それでは問題が解決しない場合は、ディープコピーを実行するとバキュームが不要になります。ディープコピーを実行するには、まずテーブルのコピーを作成し、元のテーブルからコピーに行を挿入します。次に元のテーブルを削除し、コピーの名前を変更します。多くの場合、ディープコピーはバキュームよりはるかに高速です。詳細については、「ディープコピーを実行する」を参照してください。

たとえば、テーブル calendardays に 365 列あるとします。ロード操作の後、バキュームを実行すると、以下の例に示すように失敗します。

Copy to clipboard
vacuum calendardays; An error occurred when executing the SQL command: vacuum calendardays; ERROR: 1036 DETAIL: Vacuum column limit exceeded for table calendardays HINT: Increase the value of wlm_query_slot_count or perform a deep copy instead of a vacuum.

以下の例は wlm_query_slot_count を 10 に設定し、バキュームを実行してから、wlm_query_slot_count を 1 にリセットしています。スロット数が多いと、バキュームは成功します。

Copy to clipboard
set wlm_query_slot_count to 10; vacuum calendardays; set wlm_query_slot_count to 1; vacuum executed successfully

バキュームの代わりにディープコピーを実行できます。以下の例では、CREATE TABLE LIKE を使用してディープコピーを実行しています。

Copy to clipboard
create table likecalendardays (like calendardays); insert into likecalendardays (select * from calendardays); drop table calendardays; alter table likecalendardays rename to calendardays;

CREATE TABLE AS (CTAS) を使用したディープコピーの実行は、CREATE TABLE LIKE を使用した場合よりも高速ですが、CTAS の場合、親テーブルのソートキー、エンコーディング、分散キー、notnull 属性は保持されません。ディープコピーの各種方法を比較する場合は、「ディープコピーを実行する」を参照してください。