すべてのプロダクト
Search
ドキュメントセンター

Hologres:REBUILD

最終更新日:Feb 07, 2026

Hologres は、ALTER TABLE 構文を使用して特定のテーブルスキーマ、テーブルプロパティ、および列プロパティを変更することをサポートしています。ただし、ALTER TABLE はテーブルストレージに影響するプロパティの変更をサポートしていません。Hologres V3.1 以降では、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 タスクを非同期的に実行することを指定します。コマンドを実行すると、タスクの query_id が返されます。この query_id を使用してタスクステータスを監視できます。同期実行はサポートされていません。

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

列の非 NULL 制約を設定または削除します。

ALTER PRIMARY KEY

テーブルのプライマリキーを変更します。新しいプライマリキーがデータ競合を引き起こす場合、非同期実行中にエラーが報告されます。タスク実行ステータスを監視してください。

TO [LOGICAL] PARTITION

テーブルを論理パーティションテーブルまたは物理パーティションテーブルに変換します。以下のシナリオがサポートされています。

  • 標準テーブルを物理パーティションテーブルに変換します。パーティションキーを指定する必要があります。

  • 標準テーブルを論理パーティションテーブルに変換します。パーティションキーを指定する必要があります。

  • 物理パーティションテーブルのパーティションキーを変更します。

  • 物理パーティションテーブルを論理パーティションテーブルに変換します。パーティションキーをオプションで変更できます。

  • 論理パーティションテーブルを物理パーティションテーブルに変換することはサポートされていません。

SET ( <parameter> [= <value>])

テーブルプロパティを変更します。一般的なシナリオは以下のとおりです。

  • 分散キー (distribution_key) を変更します。

  • セグメントキー (event_time_column) を変更します。

  • クラスタリングキー (clustering_key) を変更します。

  • テーブルストレージ形式 (orientation) を変更します: ローストア、列のストア、行と列のハイブリッドストア間で変換します。

  • テーブルが属する table_group を変更します。

  • その他のすべてのテーブルプロパティを変更できます。

  • ビットマップインデックス (bitmap_columns) または辞書エンコードされた列 (dictionary_encoding_columns) を変更するために `REBUILD` を使用する必要はありません。代わりに `ALTER TABLE` 構文を使用してください。

WITH (<rebuild_parameter> [= <value>])

REBUILD タスクのパラメーターを設定します。一般的なパラメーターは以下のとおりです。

  • `keep_source`: 値は不要です。変換後、ソーステーブルは削除されません。ソーステーブルは tmp_rebuild_old_<query_id>_<unique_id>_<table_name> に名前が変更されます。

  • `binlog_mode`: 値は不要です。バイナリログが有効なテーブルで REBUILD を実行できます。詳細については、バイナリログデータの損失を避けるための「使用例」セクションをご参照ください。

  • rebuild_guc_hg_computing_resource='serverless': サーバーレスリソースを使用して REBUILD タスクを実行します。これにより、タスクがご利用のインスタンスリソースを占有するのを防ぎ、タスクの安定性を向上させます。

  • rebuild_guc_<guc_name>='<guc_value>': ここで他の GUC パラメーターを設定できます。詳細については、「GUC パラメーター」をご参照ください。

注意事項

  • 非同期実行のみがサポートされています。これにより、接続が長時間占有されるのを防ぎます。

  • REBUILD タスクを送信すると、送信プロセスは迅速に完了し、タスクの query_id が返されます。この query_id を使用して、REBUILD タスクの実行ステータスを表示できます。送信が完了しない場合、これは現在のインスタンスで多くの非同期スケジューリングタスクが実行されているためである可能性があります。この場合、タスク実行ステータスを確認する前に query_id が返されるのを待ってください。

  • REBUILD によるテーブルパラメーターの変更には、データ再分散が伴い、コンピューティングリソースを消費します。ビジネスの安定性を確保するために、オフピーク時に REBUILD タスクを実行するか、サーバーレスコンピューティングリソースを使用してください。

  • REBUILD タスクの実行中、テーブルは一定期間読み取り専用状態になり、データは書き込めません。Hologres V4.1 以降では、Dynamic Table テクノロジーに基づく増分更新により、再構築中の読み取り専用期間が大幅に短縮されます。ターゲットテーブルは以下の要件を満たす必要があります。そうでない場合、書き込み操作は長時間中断されます。

    • ターゲットテーブルは再構築前にプライマリキーを持ち、新しいプライマリキーには元のプライマリキーが含まれています。

    • ターゲットテーブルは再構築前に列のストアまたは行と列のハイブリッドストアテーブルです。

    • ターゲットテーブルは再構築後に生成された列を含みません。

    • ターゲットテーブルが再構築前に物理パーティションテーブルである場合、パーティションキーは再構築後も変更されないままでなければなりません。

    • ターゲットテーブルが再構築後に論理パーティションテーブルである場合、パーティションキーは1つのみです。

  • オーバーヘッドを削減するために、単一の REBUILD タスクで複数のパラメーターを変更してください。

  • 物理パーティションテーブルが再構築された後、動的パーティション管理のプロパティは継承されません。REBUILD タスク完了後にこれらを設定する必要があります。これらのプロパティには以下が含まれます。

    • 親テーブルの auto_partitioning プロパティ。

    • 子テーブルのプロパティ (例: keep_alive)。

    • 物理パーティションテーブルが再構築された後、子テーブルに個別に設定されていたプロパティは継承されません。子テーブルのプロパティは親テーブルのプロパティと一致するようになります。例として、bitmap_columns および dictionary_encoding_columns があります。

  • 以下のケースでは、テーブルで REBUILD を実行できません。

    • JSONB 列の列ストア最適化やベクターフィールドなどの特定の列プロパティ、または列制約を持つテーブル。

    • フルテキストインデックスまたはグローバルセカンダリインデックスを持つテーブル。

    • Serial または Bigserial 型の列を含むテーブル。

    • Dynamic Table またはマテリアライズドビューの依存関係を持つテーブルはサポートされていません。標準ビューの依存関係を持つテーブルはサポートされています。

使用例

バイナリログが無効なテーブルで REBUILD を実行する

-- Create a table and import data
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');

-- Add a NOT NULL column and set a default value
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';

-- Change the primary key to column a
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);

-- Use Serverless resources to run the Rebuild task, set the distribution_key and clustering_key for the table, and change the storage format to row-column hybrid
ASYNC REBUILD TABLE rebuild_test 
WITH (
    rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
    distribution_key = 'a',
    clustering_key = 'a',
    orientation = 'row,column'
);

-- Convert the non-partitioned table to a logical partitioned table, set the partition key to ds, and add the NOT NULL property to the ds column
ASYNC REBUILD TABLE rebuild_test 
    ALTER COLUMN ds SET NOT NULL,
    TO LOGICAL PARTITION BY LIST(ds);

バイナリログが有効なテーブルで REBUILD を実行する

REBUILD は過去のバイナリログデータを保持しません。デフォルトでは、バイナリログが有効なテーブルで REBUILD を実行することはできません。タスクを実行するには、binlog_mode パラメーターを指定し、以下の手順に従う必要があります。これにより、ダウンストリームクライアントがすべての過去のバイナリログデータを完全に消費したことが保証されます。

  1. REBUILD を実行します。

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <YOUR_ACTION>;
  2. binlog_mode パラメーターが設定された REBUILD タスクの場合、タスクは set_readonly ステップが完了すると自動的に一時停止します。以下の SQL ステートメントを使用して進行状況をクエリできます。この時点で、システムはテーブルを読み取り専用に設定しています。データはテーブルに書き込めず、新しいバイナリログデータは生成されません。

    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)
  3. ダウンストリームクライアントが既存のバイナリログデータの消費を完了するのを待ちます。その後、以下の SQL ステートメントを手動で実行して REBUILD タスクを再開します。タスクが再開されている間も、ソーステーブルは読み取り専用のままであり、新しいバイナリログデータは生成されません。

    RESUME '<query_id>';

    REBUILD タスクが正常に実行されると、新しいテーブルに対してバイナリログが自動的に有効になります。その後、ダウンストリームのバイナリログ消費タスクを再開し、lsn = 0 から新しいテーブルのバイナリログの消費を開始できます。

監視と運用保守

REBUILD タスクの実行ステータス表示

REBUILD タスクは非同期的に実行されます。タスクが送信されると、システムは成功ステータスと query_id を返します。hologres.rebuild_progress システムテーブルをクエリして、非同期サブタスクのステータスを表示する必要があります。すべてのサブタスクが成功して初めて、テーブルは再構築されたと見なされます。コマンドは以下のとおりです。

SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');

システムテーブルの列とその説明は以下のとおりです。

列名

説明

job_name

REBUILD タスクの query_id。

step_id

ステップ ID。REBUILD タスクのサブタスクは、この ID に基づいて順次実行されます。

step

ステップ名:

  • prepare: タスク準備。

  • create_tmp_table: 一時テーブルを作成します。

  • get_src_table_snapshot: ソーステーブルのデータスナップショットを取得します。

  • insert: 既存データを一時テーブルにインポートします。

  • set_readonly: 再構築するテーブルを読み取り専用に設定し、データ書き込みを停止します。

  • check_snapshot: テーブルの現在のデータスナップショットが、3番目のステップで取得したものと同じであるかどうかを確認します。同じでない場合、re-insert ステップが実行されます。

  • re-insert: 増分データをインポートします。

  • check_additional_child_table: REBUILD タスク開始後にユーザーによって新しい子テーブルが作成されたかどうかを確認します。これは物理パーティションテーブルにのみ適用されます。

  • create_additional_child_table: 一時テーブルの潜在的な新しい子テーブルを作成します。これは物理パーティションテーブルにのみ適用されます。

  • insert_additional_child_table: 既存データを新しい一時子テーブルにインポートします。これは物理パーティションテーブルにのみ適用されます。

  • swap: ソーステーブルを一時テーブルに置き換えます。

status

サブタスクのステータス。

  • done: 完了。

  • doing: 進行中。

  • NULL: このステップを実行する必要がないか、このステップを実行する必要があるかどうかがまだ不明です。

  • error: 失敗。message フィールドのエラーメッセージを確認してください。

progress

サブタスクの進行状況: m/n。`n` は実行するサブステップの数 (通常はパーティション数に比例)、`m` は実行されたサブステップの数です。

start_time

サブタスクの開始時刻。

end_time

サブタスクの終了時刻。

queryid

サブタスクの query_id。

pid

サービスプロセスID。

message

サブタスクのメッセージ。サブタスクでエラーが発生した場合、エラーメッセージがこのフィールドに記録されます。

以下は結果の例です。

opopo

REBUILD タスクの停止と再開

  • 非同期 REBUILD タスクを停止します。

    SUSPEND '<query_id>';
  • CANCEL によってキャンセルされた非同期タスクを再開します。

    RESUME '<query_id>';

REBUILD タスクの例外処理

REBUILD タスクがエラーによって中断された場合、または SUSPEND コマンドを手動で実行してタスクを一時停止した場合、RESUME コマンドを実行してタスクを続行できます。また、以下の手順に従ってタスクを終了し、ソーステーブルを回復することもできます。

  • 以下のコマンドを実行して、REBUILD プロセス中に生成された一時テーブルをクリーンアップします。

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • タスクが中断される前にソーステーブルが REBUILD タスクによって読み取り専用に設定されていた場合、以下のコマンドを実行して読み取り専用状態を解除し、書き込み操作を再開します。

    ALTER TABLE <table_name> SET (readonly = false);