全部產品
Search
文件中心

Hologres:ALTER DYNAMIC TABLE

更新時間:Nov 28, 2025

Dynamic Table支援修改部分屬性。本文為您介紹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);

修改重新整理的freshness時間

支援修改freshness的時間,最小值為1 minute,修改後立即生效。

說明

僅使用V3.1版本文法建立的Dynamic Table支援該參數。

ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> SET (freshness='<num> {minutes | hours}');

修改重新整理計算資源和規格

支援修改重新整理的計算資源,可以選擇本執行個體資源(local)或者Serverless資源(serverless)。如果是Serverless資源,支援修改計算規格。您可根據業務情況適當地調大或調小重新整理的規格,但執行個體能使用的規格有一定的限制,詳情請參見Serverless Computing使用指南

說明
  • 僅4.0.7及以上版本支援顯示填寫warehouse_name

V4.0.7及以上版本

--修改refresh的計算資源,可以選擇為本地執行或者serverless執行
ALTER [DYNAMIC] TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (['local' | 'serverless' | '<warehouse_name>'])

--修改serverless的計算資源規格
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema>.]<table_name> SET (auto_refresh_guc_hg_experimental_serverless_computing_required_cores='<num>')

V3.1版本

--修改refresh的計算資源,可以選擇為本地執行或者serverless執行
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> 
SET (computing_resource ='[local|serverless]');

--修改serverless的計算資源規格
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> 
SET (refresh_guc_hg_experimental_serverless_computing_required_cores='<num>');

V3.0版本

--修改單個表的refresh資源
ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> 
SET (<incremental/full>_guc_hg_computing_resource ='[local|serverless]');

--如果是serverless模式,還可以修改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及以上版本支援)。

重要
  • 修改為全量重新整理模式後,會將原有的增量重新整理任務停止,請根據業務需要,重新設定重新整理任務相關屬性。

  • 系統會自動將增量重新整理的狀態表清理掉,減少儲存佔用。

  • 邏輯分區Dynamic Table修改後,僅對未來的分區生效;非分區Dynamic Table修改後立即生效。

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');

修改活躍分區時間範圍

當Dynamic Table是邏輯分區表時,支援修改活躍分區的時間範圍,以此來調整自動重新整理的分區範圍。

說明
  • 僅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}');

修改Query定義和加列

V3.1版本文法

Hologres自V3.1.18版本開始,Dynamic Table支援修改Query定義,以及在Query中加列實現給Dynamic Table加列。

ALTER DYNAMIC TABLE [ IF EXISTS ] [<schema_name>.]<table_name> 
AS
<query>; -- 新的query的定義
  • 使用說明:

    • 對於新Query定義的要求如下:

      • 新的Query產生的Dynamic Table必須和原Query產生的Dynamic Table表結構相容,包括:

        • 都是分區表或者都是非分區表。

        • 表的PK相同。

        • 表的Distribution Key相同,且不允許修改Distribution Key。

        • 表的Partition Key相同,且不允許修改Partition Key。

        • 表的Clustering Key、Segment Key、表的儲存模式(列存、行列共存等)、Dictionary Encoding、Bitmap Index相同。

        • 欄位名必須相同,且不能修改欄位名。

        • 同名的欄位、資料類型相同,NULLABLE屬性相同。

      • 只能在Query中ADD Column,不支援DROP Column。新增列,已有資料保持不變,新增的列預設補NULL值,會在下一次Refresh後更新資料。

    • 修改Query定義後,Refresh的行為如下:

      • 非分區Dynamic Table:下一次Refresh時(無論是Auto Refresh還是手動Refresh)會支援Refresh Overwrite。

      • 邏輯分區Dynamic Table:活躍分區在下一次Auto Refresh會自動觸發Refresh Overwrite;歷史分區需要手動觸發一次Refresh。

      修改Query定義後,如果Query中有增量重新整理不支援的運算元,此時Refresh的行為如下:

      重新整理模式

      新Query定義支援增量重新整理

      新Query定義不支援增量重新整理

      auto_refresh_mode = 'auto'

      保持建表時指定的refresh_mode。

      refresh_mode自動變為全量重新整理。

      auto_refresh_mode = 'incremental'

      保持增量重新整理。

      重新整理報錯,需要手動改為全量重新整理。

      auto_refresh_mode = 'full'

      保持全量重新整理。

      保持全量重新整理。

  • 使用樣本

    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'); -- 重複值
      
      --建立一張dynamic table
      CREATE  DYNAMIC TABLE dt_employees
      WITH (
        -- dynamic table的屬性
        freshness = '1 minutes', 
        auto_refresh_mode = 'auto',
        distribution_key = 'department_id'
      )
      AS 
      SELECT
          department_id
      FROM employees   
      GROUP BY department_id;
      
      --查詢dynamic table中的資料
      SELECT * FROM dt_employees;
    2. 對Dynamic Table新增一列。

      --新增一列
      ALTER DYNAMIC TABLE dt_employees
      AS 
      SELECT
          department_id,
         STRING_AGG(DISTINCT employee_name, ', ') AS unique_employees
      FROM employees   
      GROUP BY department_id;
      

      執行成功後查詢Dynamic Table的資料,可以看到新增的資料是NULL。

      department_id	|unique_employees
      -----------|--------
      1	|\N
      2	|\N

      等到下一次Refresh成功後,可以看到新增的列資料已經重新整理完成。

      department_id	|unique_employees
      -------------|---------
      1	|Jane, John
      2 |	Bob, Alice

V3.0版本文法

Hologres V3.0支援修改Query定義,文法如下,目前僅支援全量模式修改,增量模式暫不支援。

說明
  • 修改Query定義後,只會修改表的Query定義,並不會修改原來的欄位名、欄位屬性等。

  • 請謹慎執行修改Query定義,如果新Query的欄位與原欄位不一致,可能會導致Refresh報錯或資料不一致等問題。

ALTER DYNAMIC TABLE [IF EXISTS] [<schema>.]<table_name> SET (task_definition = $$<new_query>$$); 
說明

使用ALTER DYNAMIC TABLE語句更新動態表,若字串被半形單引號('')包裹,通過HG_DUMP_SCRIPT函數擷取動態表DDL與HoloWeb展示的DDL不一致。原因是PostgreSQL認為傳入的字串識別為Identifier,並通過TRUNCATE截斷至128字元導致。因此,建議將半形單引號('')替換為$$ XXX $$

修改重新整理開始時間

修改重新整理的開始時間,只能修改為未來的指定時間。僅V3.0版本建立的Dynamic Table支援該文法。

--修改重新整理的開始時間full_auto_refresh_schd_start_time。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (<incremental/full>_auto_refresh_schd_start_time = '<timestamptz>');

修改重新整理時間間隔

支援修改Dynamic Table的重新整理時間間隔。修改後的重新整理任務將會使用新設定的重新整理間隔執行。僅V3.0版本建立的Dynamic Table支援該文法。

--修改重新整理的時間間隔full_auto_refresh_interval,如三分鐘為'3 minutes'。
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET (<incremental/full>_auto_refresh_interval = '[<num> { minutes | hours}]');

修改Dynamic Table表屬性

Dynamic Table支援修改以下表屬性,其他未提及的屬性暫不支援修改。詳情請參見ALTER TABLE

說明

從Hologres V3.1.20版本開始,支援ALTER DYNAMIC TABLE RENAMEALTER DYNAMIC TABLE SET SCHEMA,Hologres V3.1.20以下版本支援ALTER TABLE RENAMEALTER TABLE SET SCHEMA

--重新命名表名,Hologres V3.1.20及以上版本支援ALTER DYNAMIC TABLE RENAME
ALTER DYNAMIC TABLE [IF EXISTS] <table_name> RENAME TO <new_name>;

--修改dictionary
ALTER DYNAMIC TABLE [<schema_name>].<table_name> SET (dictionary_encoding_columns = '[columnName{:[on|off|auto]}[,...]]'); 

--修改bitmap
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');

--修改schema
ALTER DYNAMIC TABLE [IF EXISTS] [<schema_name>.]<table_name> SET SCHEMA <new_schema>;