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

Hologres:REBUILD

最終更新日:Jan 16, 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

列の NOT 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:値は不要です。バイナリロギング (Binlog) が有効になっているテーブルで REBUILD を実行できます。データ損失を避けるために、「使用例」セクションの手順に従ってください。

  • rebuild_guc_hg_computing_resource='serverless':Serverless リソースを使用して REBUILD タスクを実行します。これにより、インスタンスリソースの使用を回避し、タスクの安定性を向上させます。

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

注意事項

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

  • REBUILD タスクを送信すると、すぐに query_id が返されます。この query_id を使用して、REBUILD タスクのステータスを確認できます。タスクの送信が完了しない場合、インスタンスで多くの非同期タスクが実行されている可能性があります。この場合、しばらく待ってから query_id が返された後にタスクステータスを確認してください。

  • REBUILD コマンドでテーブルパラメーターを変更すると、データの再配布が発生し、計算リソースを消費します。ビジネスの安定性を確保するために、オフピーク時間に REBUILD タスクを実行するか、Serverless 計算リソースを使用してください。

  • REBUILD タスク中、あるステップでテーブルが読み取り専用に設定されます。この間、テーブルにデータを書き込むことはできません。

  • REBUILD コマンドは、動的テーブルまたはマテリアライズドビューに依存するテーブルをサポートしていません。ただし、標準ビューに依存するテーブルはサポートしています。

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

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

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

    • 子テーブルの keep_alive などのプロパティ。

    • 物理パーティションテーブルが再構築された後、bitmap_columnsdictionary_encoding_columns など、子テーブルで個別に設定されたプロパティは継承されません。代わりに、それらの値は親テーブルと一致するようになります。

  • REBUILD は現在、次のテーブルをサポートしていません:

    • JSONB 列の列ストレージ最適化やベクトル列の列制約など、特定の列プロパティを持つテーブル。

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

    • Serial または Bigserial 列を持つテーブル。

使用例

バイナリロギングが有効でないテーブルでの REBUILD の実行

-- テーブルを作成し、データをインポートします。
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');

-- NOT NULL 列を追加し、デフォルト値を設定します。
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';

-- プライマリキーを列 a に変更します。
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);

-- Serverless リソースを使用して Rebuild タスクを実行します。
-- テーブルの distribution_key と clustering_key を設定し、orientation を行列ハイブリッドストアに変更します。
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);

バイナリロギングが有効なテーブルでの REBUILD の実行

REBUILD コマンドは、履歴バイナリロギング (Binlog) データを保持しません。そのため、デフォルトでバイナリロギングが有効になっているテーブルで REBUILD を実行することはできません。この操作を実行するには、REBUILD タスクで binlog_mode パラメーターを設定し、以下の手順に従う必要があります。このプロセスにより、テーブルが再構築される前に、ダウンストリームクライアントがすべての履歴 Binlog データを消費したことが保証されます。

  1. REBUILD を実行します。

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <your_action>;
  2. binlog_mode パラメーターを含む REBUILD タスクの場合、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)
  3. ダウンストリームクライアントが既存の Binlog データの消費を完了するのを待ちます。その後、手動で次の SQL コマンドを実行して REBUILD タスクを再開します。このプロセス中、ソーステーブルは読み取り専用のままであり、新しい Binlog データは生成されません。

    RESUME '<query_id>';

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

監視と O&M

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

ステップ名:

  • 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>');
  • ソーステーブルが読み取り専用に設定された後にタスクが中断された場合は、次のコマンドを使用してテーブルへの書き込み操作を復元します。

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