動的テーブルのプロパティを変更できます。このトピックでは、ALTER DYNAMIC TABLE 文の使用方法について説明します。
リフレッシュタスクの変更
リフレッシュタスクの一時停止
タスクを一時停止すると、そのテーブルの後続のすべての更新タスクの実行が停止します。
-- auto_refresh_enable: 自動更新を有効にするかどうかを指定します。false: 自動更新を一時停止します。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = false);リフレッシュタスクの再開
一時停止した更新タスクを再開できます。タスクを再開すると、テーブルの元の更新設定に基づいて実行が再開されます。
-- auto_refresh_enable: 自動更新を有効にするかどうかを指定します。true: 自動更新を有効にします。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_enable = true);更新のフレッシュネス時間の変更
鮮度時間を変更できます。最小値は 1 分です。変更はすぐに有効になります。
V3.1 構文を使用して作成された動的テーブルのみがこのパラメーターをサポートします。
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> SET (freshness='<num> {minutes | hours}');更新の計算リソースと仕様の変更
更新の計算リソースを変更できます。ローカルインスタンスリソース (local) またはサーバーレスリソース (serverless) のいずれかを選択できます。サーバーレスリソースを選択した場合、計算仕様も変更できます。必要に応じて更新の仕様を増減できます。ただし、インスタンスが使用できる仕様には制限があります。詳細については、「Serverless Computing ガイド」をご参照ください。
Hologres V4.0.7 以降のみが `warehouse_name` の明示的な指定をサポートします。
V4.0.7 以降
-- 更新の計算リソースを変更します。ローカル実行またはサーバーレス実行を選択できます。
ALTER [DYNAMIC] TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (['local' | 'serverless' | '<warehouse_name>'])
-- サーバーレス実行の計算仕様を変更します。
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>');リフレッシュモードの変更
V3.1 以降、更新モードを変更するためのオプションが増えました:
更新モードを増分更新から完全更新に変更します。これは 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 以降でのみサポートされています。
この変更は将来のパーティションにのみ有効です。既存のパーティションは影響を受けません。
-- auto_refresh_partition_active_time: 自動更新の時間範囲。この変更は将来のパーティションにのみ有効です。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (auto_refresh_partition_active_time = '<num> {minutes | hours | days}');クエリ定義の変更と列の追加
V3.1 構文
Hologres V3.1.18 以降、動的テーブルのクエリ定義を変更し、クエリに列を追加することで動的テーブルに列を追加できます。
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name>
AS
<query>; -- 新しいクエリ定義。注意事項:
新しいクエリ定義は、次の要件を満たす必要があります:
新しいクエリによって生成される動的テーブルは、元のクエリによって生成される動的テーブルと互換性のあるテーブルスキーマを持つ必要があります。これには、次の要件が含まれます:
両方のテーブルは、パーティションテーブルまたは非パーティションテーブルである必要があります。
両方のテーブルのプライマリキー (PK) は同じである必要があります。
両方のテーブルの分散キーは同じである必要があります。分散キーは変更できません。
両方のテーブルのパーティションキーは同じである必要があります。パーティションキーは変更できません。
両方のテーブルのクラスタリングキー、セグメントキー、ストレージモード (列ストアや行列ハイブリッドストアなど)、辞書エンコーディング、ビットマップインデックスは同じである必要があります。
両方のテーブルのフィールド名は同じである必要があります。フィールド名は変更できません。
同じ名前のフィールドは、同じデータ型と NULLABLE プロパティを持つ必要があります。
クエリでは列の追加のみが可能で、列の削除はできません。列を追加すると、既存のデータは変更されません。新しい列にはデフォルトで NULL 値が入力されます。データは次回の更新後に更新されます。
クエリ定義を変更した後、リフレッシュの動作は次のようになります:
非パーティション化動的テーブル: 次のリフレッシュ (自動リフレッシュまたは手動リフレッシュ) は、リフレッシュ上書きをトリガーします。
論理パーティションを持つ動的テーブル:アクティブパーティションは、次回の自動更新中に自動的に Refresh Overwrite をトリガーします。履歴パーティションには手動更新が必要です。
クエリ定義を変更した後、クエリに増分更新でサポートされていない演算子が含まれている場合、リフレッシュの動作は次のようになります:
リフレッシュモード
新しいクエリ定義が増分更新をサポート
新しいクエリ定義が増分更新をサポートしない
auto_refresh_mode = 'auto'
テーブル作成時に指定された refresh_mode が保持されます。
refresh_mode は自動的に完全更新に変更されます。
auto_refresh_mode = 'incremental'
増分更新が保持されます。
リフレッシュは失敗します。手動でモードを完全更新に変更する必要があります。
auto_refresh_mode = 'full'
完全更新が保持されます。
完全更新が保持されます。
例
サンプルデータを準備します。
-- ソーステーブルを準備します。 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;動的テーブルに列を追加します。
-- 列を追加します。 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>$$); ALTER DYNAMIC TABLE 文を使用して動的テーブルを更新する際、文字列が単一引用符 ('') で囲まれている場合、HG_DUMP_SCRIPT 関数で取得した動的テーブルのデータ定義言語 (DDL) が HoloWeb に表示される DDL と一致しなくなります。これは、PostgreSQL が入力文字列を識別子として認識し、TRUNCATE を使用して 128 文字に切り捨てるために発生します。したがって、単一引用符 ('') を $$ XXX $$ に置き換える必要があります。
リフレッシュ開始時刻の変更
更新開始時刻を変更できます。将来の指定した時刻にのみ変更できます。V3.0 で作成された動的テーブルのみがこの構文をサポートします。
-- 完全自動更新の開始時刻を変更します。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (<incremental/full>_auto_refresh_schd_start_time = '<timestamptz>');更新間隔の変更
動的テーブルの更新間隔を変更できます。更新タスクは新しい間隔で実行されます。V3.0 で作成された動的テーブルのみがこの構文をサポートします。
-- 更新間隔 full_auto_refresh_interval を変更します。たとえば、「3 minutes」は 3 分の間隔を指定します。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (<incremental/full>_auto_refresh_interval = '[<num> { minutes | hours}]');動的テーブルのプロパティの変更
動的テーブルの以下のプロパティを変更できます。記載されていないプロパティはサポートされていません。詳細については、「ALTER TABLE」をご参照ください。
Hologres V3.1.20 以降は ALTER DYNAMIC TABLE RENAME と ALTER DYNAMIC TABLE SET SCHEMA をサポートします。Hologres V3.1.20 より前のバージョンは ALTER TABLE RENAME と ALTER TABLE SET SCHEMA をサポートします。
-- テーブル名を変更します。Hologres V3.1.20 以降は ALTER DYNAMIC TABLE RENAME をサポートします。
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]}[,...]]');
-- 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>;