ALTER DYNAMIC TABLE を使用して、動的テーブルのリフレッシュ動作、コンピューティングリソース、クエリ定義、およびテーブルプロパティを変更します。本トピックで説明する操作のみがサポートされます。
構文
以下の文は、サポートされているすべての ALTER DYNAMIC TABLE 操作をまとめたものです。詳細な使用方法、パラメーター、およびバージョン制約については、以下の各セクションで説明します。
-- 自動リフレッシュの一時停止または再開
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = false | true);
-- 鮮度の変更 (V3.1+ の構文のみ)
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (freshness = '<num> {minutes | hours}');
-- コンピューティングリソースの変更
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (computing_resource = '[local | serverless | <warehouse_name>]'); -- V4.0.7+
ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name> SET (auto_refresh_guc_hg_experimental_serverless_computing_required_cores = '<num>'); -- V4.0.7+
-- リフレッシュモードの変更
ALTER DYNAMIC TABLE <schema_name>.<table_name> SET (auto_refresh_mode = '<full/auto>'); -- V3.1+
ALTER DYNAMIC TABLE <schema_name>.<table_name> SET (refresh_mode = 'full'); -- V3.0
-- アクティブパーティションの時間範囲の変更 (V3.1+ のみ)
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_partition_active_time = '<num> {minutes | hours | days}');
-- クエリ定義の変更 (V3.1.18+)
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> AS <query>;
-- テーブル名の変更 (V3.1.20+)
ALTER DYNAMIC TABLE [IF EXISTS] <table_name> RENAME TO <new_name>;
-- ディクショナリエンコーディング、ビットマップインデックス、TTL、スキーマの変更
ALTER DYNAMIC TABLE [<schema_name>.]<table_name> SET (dictionary_encoding_columns = '[<columnName>{:[on|off|auto]}[,...]]');
ALTER DYNAMIC TABLE [<schema_name>.]<table_name> SET (bitmap_columns = '[<columnName>{:[on|off]}[,...]]');
ALTER DYNAMIC TABLE [<schema_name>.]<table_name> SET (time_to_live_in_seconds = '<num>');
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;
リフレッシュタスクの管理
自動リフレッシュの一時停止
メンテナンスやアップストリームのデータ移行中など、すべてのリフレッシュ処理を一時的に停止する必要がある場合に使用します。一時停止後、明示的に再開するまで、以降のすべてのリフレッシュタスクは停止します。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = false);
自動リフレッシュの再開
一時停止した動的テーブルを再開すると、テーブルの元のリフレッシュ設定に基づいてリフレッシュ動作が復元されます。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = true);
鮮度の変更
鮮度を短くすると、より最新のデータを取得できます。リアルタイムに近いデータが必要ない場合は、鮮度を長くしてコンピューティングコストを削減します。
このパラメーターは、V3.1 の構文で作成された動的テーブルでのみサポートされます。
最小値は 1 分です。変更はすぐに有効になります。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (freshness = '<num> {minutes | hours}');
コンピューティングリソースの変更
インスタンスリソース (local) とサーバーレスリソース (serverless) を切り替えるか、サーバーレスのコンピュートサイズを変更します。インスタンスレベルの制限は、利用可能なサーバーレスの最大仕様に適用されます。詳細については、「サーバーレスコンピューティングの操作」をご参照ください。
構文はバージョンによって異なります:
V4.0.7 以降
-- コンピューティングリソースタイプの切り替え
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (computing_resource = '[local | serverless | <warehouse_name>]');
-- サーバーレスのコンピュートサイズ (vCPU 数) の設定
ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name>
SET (auto_refresh_guc_hg_experimental_serverless_computing_required_cores = '<num>');
V3.1
-- コンピューティングリソースタイプの切り替え
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (computing_resource = '[local|serverless]');
-- サーバーレスのコンピュートサイズの設定
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (refresh_guc_hg_experimental_serverless_computing_required_cores = '<num>');
V3.0
-- コンピューティングリソースタイプの切り替え
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (<incremental/full>_guc_hg_computing_resource = '[local|serverless]');
-- サーバーレスのコンピュートサイズの設定
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (<incremental/full>_guc_hg_experimental_serverless_computing_required_cores = '<num>');
リフレッシュモードの変更
クエリやデータパイプラインの要件が変更された場合に、リフレッシュモードを変更します。たとえば、増分リフレッシュではサポートされない演算子を追加した後に、増分リフレッシュからフルリフレッシュに切り替える場合などです。
-
フルリフレッシュに変更すると、元の増分リフレッシュタスクは停止します。必要に応じて、リフレッシュ関連のプロパティを再設定してください。
-
Hologres は、増分リフレッシュに使用されるステートテーブルを自動的にクリーンアップし、ストレージ使用量を削減します。
-
論理パーティション化された動的テーブルの場合、変更は将来のパーティションにのみ有効です。パーティション化されていない動的テーブルの場合、変更はすぐに有効になります。
バージョン別の移行サポート:
|
移行 |
サポート開始バージョン |
|
増分リフレッシュからフルリフレッシュ |
V3.0 |
|
自動リフレッシュからフルリフレッシュ |
V3.1 |
V3.1 の構文
ALTER DYNAMIC TABLE <schema_name>.<table_name> SET (auto_refresh_mode = '<full/auto>');
V3.0 の構文
ALTER DYNAMIC TABLE <schema_name>.<table_name> SET (refresh_mode = 'full');
アクティブパーティションの時間範囲の変更
論理パーティション化された動的テーブルの場合、アクティブパーティションの範囲を狭めたり広げたりして、自動リフレッシュに含めるパーティションを制御します。
V3.1 以降でのみサポートされています。
この変更は将来のパーティションにのみ適用されます。既存のパーティションは影響を受けません。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (auto_refresh_partition_active_time = '<num> {minutes | hours | days}');
リフレッシュ開始時刻の変更 (V3.0 のみ)
自動リフレッシュタスクの将来の開始時刻を設定します。このパラメーターは、V3.0 の構文で作成された動的テーブルでのみサポートされます。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (<incremental/full>_auto_refresh_schd_start_time = '<timestamptz>');
リフレッシュ間隔の変更 (V3.0 のみ)
自動リフレッシュの実行頻度を変更します。このパラメーターは、V3.0 の構文で作成された動的テーブルでのみサポートされます。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
SET (<incremental/full>_auto_refresh_interval = '[<num> { minutes | hours}]');
クエリ定義の変更
V3.1.18 以降
Hologres V3.1.18 以降、動的テーブルのクエリ定義を更新して列を追加できます。新しいクエリは、元のスキーマと互換性のあるスキーマを生成する必要があります。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name>
AS
<query>;
互換性要件
新しいクエリは、次のすべてを満たす必要があります:
-
元と新しいクエリの両方が同じテーブルタイプ (両方ともパーティション化されているか、両方ともパーティション化されていないか) を生成すること。
-
プライマリキー (PK) が同一であること。
-
分散キーが同一であること。
-
パーティションキーが同一であること。
-
クラスタリングキー、セグメントキー、ストレージの向き (列指向または行列ハイブリッド)、ディクショナリエンコーディング、およびビットマップインデックスが同一であること。
-
元のクエリに存在するすべてのフィールドが含まれていること。
-
同じ名前のフィールドは、同じデータ型と NULLABLE プロパティを持つこと。
列の変更ルール
-
列の追加はサポートされていますが、列の削除はサポートされていません。
-
既存のデータは影響を受けません。新しい列は、次のリフレッシュまで NULL で埋められます。
クエリ定義変更後のリフレッシュ動作
クエリ定義が更新された後、次のリフレッシュは以下のようにトリガーされます:
|
テーブルタイプ |
次のリフレッシュ動作 |
|
パーティション化されていない動的テーブル |
次のリフレッシュ (自動または手動) で上書きリフレッシュがトリガーされます。 |
|
論理パーティションを持つ動的テーブル |
アクティブパーティションは、次の自動リフレッシュ中に上書きリフレッシュをトリガーします。履歴パーティションには手動リフレッシュが必要です。 |
新しいクエリに増分リフレッシュではサポートされない演算子が含まれている場合、有効なリフレッシュモードは現在の設定に基づいて変更されます:
|
現在の |
新しいクエリが増分リフレッシュをサポートする場合 |
新しいクエリが増分リフレッシュをサポートしない場合 |
|
|
テーブル作成時の |
|
|
|
増分リフレッシュが維持されます。 |
リフレッシュは失敗します。手動でモードをフルリフレッシュに変更してください。 |
|
|
フルリフレッシュが維持されます。 |
フルリフレッシュが維持されます。 |
例:列の追加
ステップ 1: ソーステーブルと動的テーブルの準備
-- ソーステーブルを作成します。
CREATE TABLE employees (
department_id INT,
employee_name VARCHAR
);
-- サンプルデータを挿入します。
INSERT INTO employees (department_id, employee_name) VALUES
(1, 'John'),
(1, 'Jane'),
(1, 'John'), -- 複製
(2, 'Alice'),
(2, 'Bob'),
(2, 'Alice'); -- 複製
-- 部門ごとに従業員をグループ化する動的テーブルを作成します。
CREATE DYNAMIC TABLE dt_employees
WITH (
freshness = '1 minutes',
auto_refresh_mode = 'auto',
distribution_key = 'department_id'
)
AS
SELECT department_id
FROM employees
GROUP BY department_id;
-- 初期データを確認します。
SELECT * FROM dt_employees;
ステップ 2: クエリ定義を更新して列を追加
ALTER DYNAMIC TABLE dt_employees
AS
SELECT
department_id,
STRING_AGG(DISTINCT employee_name, ', ') AS unique_employees
FROM employees
GROUP BY department_id;
文の実行直後、新しい列には NULL が含まれます:
department_id | unique_employees
--------------+------------------
1 | \N
2 | \N
次のリフレッシュが完了すると、列にデータが入力されます:
department_id | unique_employees
--------------+------------------
1 | Jane, John
2 | Bob, Alice
V3.0 の構文
Hologres V3.0 はクエリ定義の変更をサポートしていますが、フルリフレッシュモードでのみ可能です。増分リフレッシュモードはサポートされていません。
クエリ定義の変更は、クエリ定義のみを変更します。元のフィールド名やフィールドプロパティは変更されません。
新しいクエリのフィールドが元のフィールドと一致しない場合、リフレッシュエラーやデータの不整合が発生する可能性があります。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name>
SET (task_definition = $$<new_query>$$);
単一引用符 ('') の代わりに$$ ... $$を使用してください。単一引用符を使用すると、PostgreSQL が入力を識別子として扱い、128 文字に切り捨てるため、HG_DUMP_SCRIPTで取得した DDL が HoloWeb の表示と一致しない場合があります。
テーブルプロパティの変更
以下のテーブルプロパティを変更できます。ここに記載されていないプロパティはサポートされていません。その他のテーブルの変更については、「ALTER TABLE」をご参照ください。
ALTER DYNAMIC TABLE RENAMEおよびALTER DYNAMIC TABLE SET SCHEMAは V3.1.20 以降でサポートされています。以前のバージョンでは、ALTER TABLE RENAMEおよびALTER TABLE SET SCHEMAを使用してください。
-- テーブル名の変更 (V3.1.20+)
ALTER DYNAMIC TABLE [IF EXISTS] <table_name> RENAME TO <new_name>;
-- ディクショナリエンコーディングの変更
ALTER DYNAMIC TABLE [<schema_name>.]<table_name>
SET (dictionary_encoding_columns = '[<columnName>{:[on|off|auto]}[,...]]');
-- ビットマップインデックスの変更
ALTER DYNAMIC TABLE [<schema_name>.]<table_name>
SET (bitmap_columns = '[<columnName>{:[on|off]}[,...]]');
-- Time-to-Live (TTL) の秒単位での変更
ALTER DYNAMIC TABLE [<schema_name>.]<table_name>
SET (time_to_live_in_seconds = '<num>');
-- テーブルを別のスキーマに移動
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;