Hologres は、ALTER TABLE 構文を使用して一部のテーブル構造、テーブルプロパティ、および列プロパティの変更をサポートしています。ただし、テーブルストレージに影響を与えるプロパティについては、ALTER TABLE 構文はサポートされていません。Hologres V3.1 以降、REBUILD 構文がサポートされるようになりました。REBUILD 構文を使用すると、テーブルのさまざまなパラメーターを柔軟に変更できます。このトピックでは、Hologres で REBUILD を使用する方法について説明します。
構文
ステートメントのフォーマット
ASYNC REBUILD TABLE [ IF EXISTS ] <table_name>
[ WITH ( <rebuild_parameter> [= <value>] [, ... ] )]
<action> [, ... ];
WHERE action IS ONE OF:
ADD [ COLUMN ] <column_name> <data_type> [ column_constraint [ ... ] ]
ALTER [ COLUMN ] <column_name> [ SET DATA ] TYPE <data_type> [ USING <expression> ]
ALTER [ COLUMN ] <column_name> SET DEFAULT <expression>
ALTER [ COLUMN ] <column_name> DROP DEFAULT
ALTER [ COLUMN ] <column_name> { SET | DROP } NOT NULL
ALTER PRIMARY KEY (<column_name> [, ...])
TO [LOGICAL] PARTITION [BY LIST(<column_name> [, <column_name>])]
SET ( <parameter> [= <value>] [, ... ] )
WHERE rebuild_parameter IS ONE OF:
keep_source
binlog_mode
rebuild_guc_<guc_name> = '<guc_value>'
パラメーター
パラメーター | サブ項目 | 説明 |
ASYNC |
REBUILD タスクは非同期で実行されます。タスクが実行されると、 |
|
table_name | 再構築するターゲットテーブルの名前。 | |
column_name | ターゲットテーブルの列名。 | |
data_type | 列のデータ型。 | |
action | ADD COLUMN | 列を追加します。NOT NULL 列を追加し、デフォルト値を設定できます。 |
ALTER COLUMN TYPE | 列のデータ型を変更します。 | |
ALTER COLUMN SET/DROP DEFAULT | 列のデフォルト値を設定または削除します。既存データの NULL 値は変更されません。 | |
ALTER COLUMN SET/DROP NOT NULL | 列の NOT NULL 制約を設定または削除します。 | |
ALTER PRIMARY KEY | テーブルのプライマリキーを変更します。新しいプライマリキーとデータ競合がある場合、非同期実行中にエラーが報告されます。タスクの実行ステータスを速やかに監視してください。 | |
TO [LOGICAL] PARTITION |
テーブルを論理/物理パーティションテーブルに変換します。次のシナリオをサポートします:
|
|
SET ( <parameter> [= <value>]) |
テーブルプロパティを変更します。一般的なシナリオ:
|
|
WITH (<rebuild_parameter> [= <value>]) |
REBUILD タスク関連のパラメーターを設定します。一般的なパラメーター:
|
|
注意事項
非同期実行 (ASYNC) のみがサポートされており、長期間の接続占有は必要ありません。
-
REBUILD タスクを送信すると、迅速に実行されて
query_idが返されます。 このquery_idを使用して、REBUILD タスクの実行ステータスを確認することができます。 送信後、タスクがしばらく正常に完了しない場合、現在のインスタンスで多数の非同期スケジューリングタスクが実行されていることが原因である可能性があります。query_idが返された後、しばらく待ってからタスクの実行ステータスを確認することをお勧めします。 REBUILD 機能を使用してテーブルパラメーターを変更すると、内部的なデータ再配布が行われ、コンピューティングリソースが消費されます。そのため、ビジネスのオフピーク時間帯に REBUILD タスクを実行するか、この操作にサーバーレスコンピューティングリソースを使用してビジネスの安定性を確保することを推奨します。
-
REBUILDタスク中、テーブルは読み取り専用となり、書き込みはできません。Hologres V4.1 以降、REBUILDはDynamic Tableテクノロジーを使用して増分更新を行い、読み取り専用ウィンドウを大幅に短縮します。長時間の書き込みダウンタイムを避けるために、ターゲットテーブルは次の要件を満たす必要があります:-
REBUILD操作の前にテーブルにプライマリキーが必要であり、新しいプライマリキーには元のプライマリキーのすべての列が含まれている必要があります。 -
REBUILD操作の前に、テーブルは列指向ストレージまたは行列ハイブリッドストレージを使用している必要があります。 -
REBUILD操作の後、テーブルに生成列が含まれていてはなりません。 -
REBUILD操作の前にテーブルが物理パーティションテーブルである場合、そのパーティションキーは変更してはなりません。 -
REBUILD操作の後にテーブルが論理パーティションテーブルになる場合、パーティションキーは 1 つしか持てません。
-
-
オーバーヘッドを削減するために、1 つの
REBUILDタスクで複数のパラメーターを変更してください。 -
物理パーティションテーブルを再構築した後、その「動的パーティション管理」プロパティは継承されません。再構築が完了した後、次のプロパティを手動で設定する必要があります:
-
親テーブルの
auto_partitioningプロパティ。 -
子テーブルの
keep_aliveおよびその他の属性。 -
物理パーティションテーブルを再構築すると、子テーブルに個別に設定されていた
bitmap_columnsやdictionary_encoding_columnsなどのプロパティは継承されず、親テーブルの設定に復元されます。
-
-
REBUILDは、次のテーブルではサポートされていません:-
JSONB 列の列指向ストレージ最適化や、ベクター列などの列制約など、特別な列プロパティ設定を持つテーブル。
-
フルテキストインデックスまたはグローバルセカンダリインデックスを持つテーブル。
-
SerialまたはBigserialデータ型の列を含むテーブル。 -
Dynamic Tableまたはマテリアライズドビューによって参照されるテーブル。ビューによって参照されるテーブルはサポートされています。
-
例
Binlog がないテーブルの再構築
-- テーブルを作成し、データをインポートします。
CREATE TABLE rebuild_test (
a TEXT,
b TEXT,
ds TEXT
);
INSERT INTO rebuild_test VALUES ('1', '1', '2025-04-01'), ('2', '2', '2025-04-02'), ('3', '3', '2025-04-03');
-- デフォルト値を持つ非 NULL 列を追加します。
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';
-- プライマリキーを列 a に変更します。
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);
-- サーバーレスリソースを使用して REBUILD タスクを実行し、テーブルの distribution_key と clustering_key を設定し、ストレージを行列ハイブリッドに変更します。
ASYNC REBUILD TABLE rebuild_test
WITH (
rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
distribution_key = 'a',
clustering_key = 'a',
orientation = 'row,column'
);
-- 非パーティションテーブルを論理パーティションテーブルに変換し、パーティションキーを ds に設定し、ds 列に NOT NULL 制約を追加します。
ASYNC REBUILD TABLE rebuild_test
ALTER COLUMN ds SET NOT NULL,
TO LOGICAL PARTITION BY LIST(ds);
Binlog があるテーブルの再構築
REBUILD は履歴 Binlog データを保持しません。したがって、Binlog が有効になっているテーブルでは、デフォルトで REBUILD はサポートされていません。ダウンストリームシステムが履歴 Binlog データを完全に消費したことを確認するには、binlog_mode パラメーターを指定し、以下の手順に従う必要があります。
-
REBUILDコマンドを実行します。ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>; -
REBUILD タスクで
binlog_modeパラメーターが設定されている場合、set_readonlyステップが完了すると、タスクは自動的に一時停止します。SQL クエリを実行して進捗状況を確認できます。この時点で、テーブルは読み取り専用に設定されています。これにより、テーブルへのデータの書き込みができなくなり、新しい Binlog データは生成されません。postgres=# SELECT step, status, progress FROM hologres.rebuild_progress('<query_id>'); step | status | progress -------------------------------+--------+---------- prepare | done | 1/1 create_tmp_table | done | 1/1 get_src_table_snapshot | done | 1/1 insert | done | 1/1 set_readonly | done | 1/1 check_snapshot | | 0/1 re-insert | | - check_additional_child_table | | - create_additional_child_table | | - insert_additional_child_table | | - swap | | 0/1 (11 rows) -
下流クライアントが既存のすべての Binlog データの消費を完了するのを待ちます。その後、次の SQL ステートメントを実行して
REBUILDタスクを手動で再開します。このプロセス中、ソーステーブルは読み取り専用モードのままであり、新しい Binlog データは生成されません。RESUME '<query_id>';REBUILDタスクが完了すると、新しいテーブルで Binlog が自動的に有効になります。その後、ダウンストリームの Binlog 消費タスクを再開し、lsn = 0から消費を開始できます。
監視と運用保守
REBUILD タスクの実行ステータスの表示
REBUILD タスクは非同期で実行されます。タスクが正常に送信されると、成功ステータスと query_id が返されます。非同期サブタスクのステータスを表示するには、hologres.rebuild_progress システムテーブルにクエリを実行する必要があります。テーブルに対する REBUILD 操作は、すべてのサブタスクが成功した場合にのみ完了します。コマンドは以下のとおりです。
SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');
次の表に、システムテーブルの列について説明します。
列名 | 説明 |
job_name | REBUILD タスクの query_id。 |
step_id | ステップ ID。REBUILD のサブタスクは、ステップ ID に従って順次実行されます。 |
step |
ステップ名:
|
status | サブタスクのステータス。
|
progress |
サブタスクの進捗: |
start_time | サブタスクの開始時刻。 |
end_time | サブタスクの終了時刻。 |
queryid | サブタスクの query_id。 |
pid | サービスプロセス ID。 |
message | サブタスクのメッセージ。サブタスクがエラーを報告した場合、エラーメッセージがこのフィールドに記録されます。 |
次の図は、サンプル結果を示しています。

REBUILD タスクの停止と再開
-
REBUILD非同期タスクを停止します。SUSPEND '<query_id>'; -
CANCELに設定された非同期タスクを再開します。RESUME '<query_id>';
REBUILD タスク例外の処理
REBUILD タスクがエラーで中断された場合、または SUSPEND コマンドを使用して手動で停止した場合は、RESUME コマンドで再開するか、次の手順に従ってタスクを終了し、ソーステーブルを復元できます。
-
次のコマンドを実行して、
REBUILDプロセス中に作成された一時テーブルをクリーンアップします。CALL hg_clean_rebuild_tmp_tables('<query_id>'); -
ソーステーブルが読み取り専用になった後にタスクが中断された場合は、適切なコマンドを実行して書き込みを再度有効にします。
-
Hologres V4.1 より前のバージョンの場合:
ALTER TABLE <table_name> SET (readonly = false); -
Hologres V4.1 以降の場合:
ALTER TABLE <table_name> SET RESET (ddl_options,write_options);
-