ALTER DYNAMIC TABLE

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使用指南

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版本语法

HologresV3.1.18版本开始,Dynamic Table支持修改Query定义,以及在Query中加列实现给Dynamic Table加列。

ALTER DYNAMIC TABLE [ IF NOT 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属性相同。

      • 只能在QueryADD 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函数获取动态表DDLHoloWeb展示的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>;

--修改定义,Hologres V3.1.20及以上版本支持ALTER DYNAMIC TABLE SET SCHEMA
ALTER DYNAMIC TABLE [IF EXISTS] <table_name> SET (TASK_DEFINITION = 'select xxx');

--修改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>;