CREATE DYNAMIC TABLE

本文为您介绍如何创建Dynamic Table。

注意事项

  • Dynamic Table的使用限制请参见Dynamic Table支持范围和限制

  • Hologres V3.1版本开始,新建Dynamic Table默认使用新语法。对于V3.0版本中已存在的Dynamic Table,仅支持执行ALTER操作,不支持使用V3.0版本的语法创建表。非分区表可以通过语法转换命令,将V3.0版本的语法转换成V3.1版本的新语法,如果是分区表,请手动重新创建。

  • Hologres V3.1版本开始,增量刷新的Dynamic Table需重新创建,您可以通过语法转换命令进行重建。

  • Hologres V3.1版本开始,引擎自适应优化Dynamic TableRefresh执行过程,使Refresh更加稳定地执行。因此,与Refresh相关的Query ID出现负数的情况属于正常现象。

语法

V3.1(新语法)

说明

Hologres V3.1版本开始,仅支持使用新语法建表。

建表语法

Hologres V3.1版本开始,Dynamic Table的建表语法如下:

CREATE DYNAMIC TABLE [ IF NOT EXISTS ] [<schema_name>.]<table_name> (
[col_name],
[col_name],
[col_name]
)
[LOGICAL PARTITION BY LIST(<partition_key>)]
WITH (
  -- dynamic table的属性
  freshness = '<num> {minutes | hours}', -- 必填
  [auto_refresh_mode = '[full | incremental | auto]',] -- 非必填
  [auto_refresh_enable = [true | false],] -- 非必填
  [base_table_cdc_format = ['stream' | 'binlog'],] -- 非必填
  
  [auto_refresh_partition_active_time = '<num> {minutes | hours | days}',] -- 非必填
  [partition_key_time_format = '[YYYY-MM-DD | [,...]]',] --非必填
  [computing_resource = '[local | serverless]',] -- 非必填
  [refresh_guc_<guc_name> = '<guc_value>',] -- 非必填

  -- 通用属性
  [orientation = '[column | row | row,column]',]
  [table_group = '[tableGroupName]',]
  [distribution_key = 'columnName[,...]]',]
  [clustering_key = '[columnName{:asc]} [,...]]',]
  [event_time_column = '[columnName [,...]]',]
  [bitmap_columns = '[columnName [,...]]',]
  [dictionary_encoding_columns = '[columnName [,...]]',]
  [time_to_live_in_seconds = '<non_negative_literal>',]
  [storage_mode = '[hot | cold]',]

)
AS
<query>; -- query的定义

参数说明

刷新模式与资源

参数名

描述

是否必填

默认值

freshness

数据的新鲜度,单位为minutes | hours,最小值为1mins,引擎会根据每次的Refresh时间、设置的freshness值,自动进行下一次Refresh,相比设置interval刷新周期,freshness会更加自动化地最大程度保障数据的新鲜度。

auto_refresh_mode

刷新模式。取值如下:

  • auto:自动模式。如果Query支持增量刷新,则优先执行增量刷新,否则退化为全量刷新。

  • incremental:增量刷新,每次只刷新增量数据。使用详情请参见增量刷新

  • full:全量刷新,每次都以全量的方式刷新表数据。使用详情请参见全量刷新

auto

auto_refresh_enable

开启或关闭自动刷新。取值为:

  • true:开启自动刷新。

  • false:关闭自动刷新。关闭之后,表的后续刷新都会被停止。

true

base_table_cdc_format

增量刷新消费基表的方式。

  • stream(默认):从文件级别读取数据的变化记录,计算增量数据,相比Binlog方式,无额外的存储开销,性能也更高。详情请参见Dynamic Table

  • binlog:以Binlog的方式消费基表的数据,设置了该参数后,还需要手动为基表开启Binlog。详情请参见订阅Hologres Binlog

    begin;
    call set_table_property('<table_name>', 'binlog.level', 'replica');
    call set_table_property('<table_name>', 'binlog.ttl', '2592000');
    commit;
说明
  • V3.1版本开始,所有表都默认使用Stream方式消费基表数据变更。如果您的表开启过Binlog,请及时关闭,以避免存储浪费。

  • 当基表为行存表时,仅支持使用Binlog方式,不支持使用Stream方式。

  • 创建表后不支持修改该参数,如需修改请重新建表。

stream

computing_resource

刷新的计算资源。取值为:

  • serverless(默认):默认使用Serverless资源,如果不满足Serverless的执行条件,将会默认退化为Local资源。Serverless使用详情请参见Serverless Computing使用指南

  • local:本实例资源。

说明

V3.1版本开始,新建表默认使用Serverless资源,V3.0版本中创建的表仍然使用创建表时指定的刷新计算资源。

serverless

refresh_guc_<guc_name>

支持对Refresh设置GUC参数,支持的GUC请参见GUC参数

分区属性

逻辑分区参数

参数名

描述

是否必填

默认值

LOGICAL PARTITION BY LIST(<partition_key>)

创建Dynamic Table为逻辑分区表,还需要为分区表设置auto_refresh_partition_active_timepartition_key_time_format两个参数,才能使用。

auto_refresh_partition_active_time

分区的刷新范围。取值单位包括minutes | hours | days。系统会根据设置的auto_refresh_partition_active_time,从当前时间开始追溯历史分区,自动刷新范围内的分区数据。

活跃分区:是指当前时间 - 分区开始时间(由分区名推导出的时间)< auto_refresh_partition_active_time

说明
  • auto_refresh_partition_active_time的单位必须大于一个Partition单位。例如按照天分区,auto_refresh_partition_active_time必须大于24h。

  • 支持修改该参数值,修改后仅对未来分区生效。

分区时间单位 + 1 hour

即允许基表的数据延迟为1小时,例如:如果按天分区,则默认值为25小时(1 day + 1 hour)。

partition_key_time_format

分区格式,当Dynamic Table逻辑分区表时,系统会根据指定的分区格式生成对应的分区。分区字段支持的类型及对应的数据格式如下:

  • Partition KeyTEXT/VARCHAR类型:

    YYYYMMDDHH24、YYYY-MM-DD-HH24、YYYY-MM-DD_HH24、YYYYMMDD、YYYY-MM-DD、YYYYMM、YYYY-MM、YYYY。

  • Partition KeyINT类型:

    YYYYMMDDHH24、YYYYMMDD、YYYYMM、YYYY。

  • Partition KeyDATE类型:

    YYYY-MM-DD

物理分区参数

参数名

描述

是否必填

默认值

PARTITION BY LIST(<partition_key>)

创建Dynamic Table为普通分区表。

相比逻辑分区Dynamic Table,普通分区Dynamic Table没有动态分区的能力,使用上存在一定的限制,建议优先使用逻辑分区。二者区别请参见分区表介绍

表属性参数

参数

描述

是否必填

默认值

full

incremental

col_name

Dynamic Table的字段名。

可以显式指定Dynamic Table的列名,但是不能指定列的属性和数据类型,引擎会自动推导。

说明

若指定了列的属性和数据类型,会导致引擎推导不正确。

Query列名

Query列名

orientation

指定Dynamic Table的存储模式,取值如下:

  • column:列存。

  • row:行存。

column

column

table_group

指定Dynamic Table所在的Table Group,默认为当前数据库下的Default Table Group,详情请参见Table GroupShard Count操作指南

默认Table Group名称

默认Table Group名称

distribution_key

指定Dynamic TableDistribution Key,详情请参见分布键Distribution Key

clustering_key

指定Dynamic TableClustering Key,详情请参见聚簇索引Clustering Key

允许设置,有默认推导值。

允许设置,有默认推导值。

event_time_column

指定Dynamic Tableevent_time_column,详情请参见Event Time Column(Segment Key)

bitmap_columns

指定Dynamic Tablebitmap_columns,详情请参见位图索引Bitmap

TEXT类型字段

TEXT类型字段

dictionary_encoding_columns

指定Dynamic Tabledictionary_encoding_columns,详情请参见字典编码Dictionary Encoding

TEXT类型字段

TEXT类型字段

time_to_live_in_seconds

指定Dynamic Table数据的生命周期。

永久

永久

storage_mode

Dynamic Table的存储模式,取值如下:

  • hot:热存,

  • cold:冷存。

说明

存储模式详情请参见数据分层存储

hot

hot

Query

Dynamic Table中数据生成的Query,设置的刷新模式不同,支持的Query类型和基表类型也不同,详情请参见Dynamic Table支持范围和限制

V3.0

建表语法

Hologres V3.0版本Dynamic Table的建表语法如下:

CREATE DYNAMIC TABLE [IF NOT EXISTS] <schema.tablename>(
[col_name],
[col_name]
  ) [PARTITION BY LIST (col_name)]
WITH (
    [refresh_mode='[full|incremental]',]
    [auto_refresh_enable='[true|false',]

  --增量刷新专用参数:
    [incremental_auto_refresh_schd_start_time='[immediate|<timestamptz>]',]
    [incremental_auto_refresh_interval='[<num> {minute|minutes|hour|hours]',]  
    [incremental_guc_hg_computing_resource='[ local | serverless]',]
    [incremental_guc_hg_experimental_serverless_computing_required_cores='<num>',]

   --全量刷新专用参数:
    [full_auto_refresh_schd_start_time='[immediate|<timestamptz>]',]
    [full_auto_refresh_interval='[<num> {minute|minutes|hour|hours]',] 
    [full_guc_hg_computing_resource='[ local | serverless]',]--hg_full_refresh_computing_resource默认serverless,可以db级别设置,用户可以不设置
    [full_guc_hg_experimental_serverless_computing_required_cores='<num>',]
    
   --共用参数,允许设置guc:
   [refresh_guc_<guc>='xxx]',] 
   
  -- Dynamic Table的通用属性:
    [orientation = '[column | row | row,column]',]
    [table_group = '[tableGroupName]',]
    [distribution_key = 'columnName[,...]]',]
    [clustering_key = '[columnName{:asc]} [,...]]',]
    [event_time_column = '[columnName [,...]]',]
    [bitmap_columns = '[columnName [,...]]',]
    [dictionary_encoding_columns = '[columnName [,...]]',]
    [time_to_live_in_seconds = '<non_negative_literal>',]
    [storage_mode = '[hot | cold]']
    ) 
AS
<query> --query的定义

参数说明

刷新模式与资源

参数分类

参数名

描述

是否必填

默认值

共用刷新参数

refresh_mode

指定数据的刷新模式,支持full、incremental两种刷新模式。

若不设置该参数,则表示不进行刷新。

auto_refresh_enable

是否开启自动刷新。取值为:

  • true:开启自动刷新。

  • false:不开启自动刷新。

false

refresh_guc_<guc>

支持对Refresh设置GUC参数,支持的GUC请参见GUC参数

说明

例如GUC参数中timezone时区设置,参数配置refresh_guc_timezone = 'GMT-8:00'

增量刷新(incremental)

incremental_auto_refresh_schd_start_time

增量刷新的开始时间。取值为:

  • immediate:默认值,建表成功后立即启动增量刷新。

  • <timestamptz>:自定义的增量刷新开始时间,例如设置为2024-08-24 1:00,则表示2024-08-24 1:00开始执行刷新任务。

immediate

incremental_auto_refresh_interval

增量刷新的时间间隔,单位有minute、minutes、hourhours。

  • 取值区间为[1min,48hours]。

  • 若不设置该参数,则表示只会在Refresh开始时间执行一次刷新操作。

incremental_guc_hg_computing_resource

指定执行增量刷新的计算资源,取值为:

  • local:本实例资源。

  • serverless:使用Serverless资源,但需注意查看实例是否满足Serverless需求,详情请参见Serverless Computing使用指南

说明

支持使用ALTER DATABASE xxx SET incremental_guc_hg_computing_resource=xx命令在DB级别设置执行增量刷新的计算资源。

local

incremental_guc_hg_experimental_serverless_computing_required_cores

如果使用Serverless资源执行刷新,则需要设置刷新的计算资源量。

说明

不同规格的实例可使用的Serverless资源有一定的限制,详情请参见Serverless Computing使用指南

全量刷新(full)

full_auto_refresh_schd_start_time

全量刷新的开始时间。取值为:

  • immediate:默认值,建表成功后立即启动全量刷新。

  • <timestamptz>:自定义的全量刷新开始时间,例如设置为2024-08-24 1:00,则表示2024-08-24 1:00开始执行刷新任务。

immediate

full_auto_refresh_interval

全量刷新的时间间隔,单位有minute、minutes、hourhours。

  • 取值区间为[1min,48hours]。

  • 若不设置该参数,则表示只会在Refresh开始时间执行一次刷新操作。

full_guc_hg_computing_resource

指定执行全量刷新的计算资源,取值为:

  • local:本实例资源。

  • serverless:使用Serverless资源,但需注意查看实例是否满足Serverless需求,详情请参见Serverless Computing使用指南

说明

支持使用ALTER DATABASE xxx SET full_guc_hg_computing_resource=xx命令在DB级别设置执行全量刷新的计算资源。

local

full_guc_hg_experimental_serverless_computing_required_cores

如果使用Serverless执行刷新,则需要设置刷新的计算资源量。

说明

不同规格的实例可使用的Serverless资源有一定的限制,详情请参见Serverless Computing使用指南

表属性参数

参数

描述

是否必填

默认值

full

incremental

col_name

Dynamic Table的字段名。

可以显式指定Dynamic Table的列名,但是不能指定列的属性和数据类型,引擎会自动推导。

说明

若指定了列的属性和数据类型,会导致引擎推导不正确。

Query列名

Query列名

orientation

指定Dynamic Table的存储模式,取值如下:

  • column:列存。

  • row:行存。

column

column

table_group

指定Dynamic Table所在的Table Group,默认为当前数据库下的Default Table Group,详情请参见Table GroupShard Count操作指南

默认Table Group名称

默认Table Group名称

distribution_key

指定Dynamic TableDistribution Key,详情请参见分布键Distribution Key

clustering_key

指定Dynamic TableClustering Key,详情请参见聚簇索引Clustering Key

允许设置,有默认推导值。

允许设置,有默认推导值。

event_time_column

指定Dynamic Tableevent_time_column,详情请参见Event Time Column(Segment Key)

bitmap_columns

指定Dynamic Tablebitmap_columns,详情请参见位图索引Bitmap

TEXT类型字段

TEXT类型字段

dictionary_encoding_columns

指定Dynamic Tabledictionary_encoding_columns,详情请参见字典编码Dictionary Encoding

TEXT类型字段

TEXT类型字段

time_to_live_in_seconds

指定Dynamic Table数据的生命周期。

永久

永久

storage_mode

Dynamic Table的存储模式,取值如下:

  • hot:热存,

  • cold:冷存。

说明

存储模式详情请参见数据分层存储

hot

hot

PARTITION BY LIST

是否为分区表,支持创建Dynamic Table分区表,使用方式与普通分区表相同,不同分区子表可以设置不同的刷新模式,来满足业务不同场景的时效性需求。

非分区表

非分区表

Query

Dynamic Table中数据生成的Query,设置的刷新模式不同,支持的Query类型和基表类型也不同,详情请参见Dynamic Table支持范围和限制

增量刷新

增量刷新通过自动感知基表数据的变化,将Query中的数据以增量的方式写入Dynamic Table。相比于全量刷新,增量刷新处理的数据量更少,处理时效性会更高。在实际应用中,如果有分钟级近实时数据查询的需求,更推荐使用增量刷新模式,但在使用增量Dynamic Table时需要注意如下几点:

  • 基表的限制:

    • Hologres V3.1版本默认使用Stream模式消费增量数据。如果您的基表在V3.0版本已经开启过Binlog,建议及时关闭,防止存储成本增加。

    • V3.0版本,需要为基表开启Binlog,如果是维表JOIN,维表无需开启Binlog。基表开启Binlog后,会有一定的存储开销,您可参考表存储明细查询Binlog占用存储。

  • 开启增量刷新后,系统会在后台生成一张状态表,用于记录中间聚合结果,关于状态表技术原理请参见Dynamic Table。状态表会存储中间聚合数据,因此会占用一定的存储,查看存储请参见查看Dynamic Table表结构和血缘

  • 当前增量刷新支持的Query和算子详情,请参见Dynamic Table支持范围和限制

多表JOIN(双流JOIN)

双流JOIN即多表JOIN,语义与OLAP查询相同,基于HASH JOIN实现,支持INNER JOIN、LEFT/RIGHT/FULL OUTER JOIN四种JOIN类型。

V3.1版本

说明

Hologres V3.1版本开始,双流JOINGUC默认开启,无需再手动设置。

示例SQL如下:

CREATE TABLE users (
  user_id INT,
  user_name TEXT,
  PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');

CREATE TABLE orders (
  order_id INT,
  user_id INT,
  PRIMARY KEY (order_id)
);
INSERT INTO orders VALUES(1, 1);

CREATE DYNAMIC TABLE dt WITH (
  auto_refresh_mode = 'incremental',
  freshness='10 minutes'
) 
AS 
SELECT order_id, orders.user_id, user_name 
FROM orders LEFT JOIN users ON orders.user_id = users.user_id;

-- 刷新之后可以看到一条关联数据
REFRESH TABLE dt;
SELECT * FROM dt;
 order_id | user_id | user_name 
----------+---------+-----------
        1 |       1 | hologres
(1 row)


UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);

-- 刷新之后可以看到两条关联数据,维表更新对所有数据生效,可以订正已关联数据
REFRESH TABLE dt;
SELECT * FROM dt;

返回结果如下:

 order_id | user_id |   user_name   
----------+---------+---------------
        1 |       1 | dynamic table
        4 |       1 | dynamic table
(2 rows)

V3.0版本

HologresV3.0.26版本开始支持多表JOIN(双流JOIN),在使用之前请先升级实例版本,同时需要执行如下GUC开启双流JOIN。

-- Session级别开启
SET hg_experimental_incremental_dynamic_table_enable_hash_join TO ON;

--DB级别开启,新建连接生效
ALTER database <db_name> SET hg_experimental_incremental_dynamic_table_enable_hash_join TO ON;

示例SQL如下:

CREATE TABLE users (
  user_id INT,
  user_name TEXT,
  PRIMARY KEY (user_id)
) WITH (binlog_level = 'replica');
INSERT INTO users VALUES(1, 'hologres');

CREATE TABLE orders (
  order_id INT,
  user_id INT,
  PRIMARY KEY (order_id)
)  WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);

CREATE DYNAMIC TABLE dt WITH (refresh_mode = 'incremental') 
AS 
SELECT order_id, orders.user_id, user_name 
FROM orders LEFT JOIN users ON orders.user_id = users.user_id;

-- 刷新之后可以看到一条关联数据
REFRESH TABLE dt;
SELECT * FROM dt;
 order_id | user_id | user_name 
----------+---------+-----------
        1 |       1 | hologres
(1 row)


UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);

-- 刷新之后可以看到两条关联数据,维表更新对所有数据生效,可以订正已关联数据
REFRESH TABLE dt;
SELECT * FROM dt;

返回结果如下:

 order_id | user_id |   user_name   
----------+---------+---------------
        1 |       1 | dynamic table
        4 |       1 | dynamic table
(2 rows)

维表JON

维表JOIN的语义是:对每条数据,只会关联当时维表的最新版本数据,即JOIN行为只发生在处理时间(Processing Time)。如果JOIN行为发生后,维表中的数据发生了变化(新增、更新或删除),则已关联的维表数据不会同步更新。示例SQL如下:

说明

维表的JOIN操作与参与表的数据量无关,只要在SQL中采用维表的JOIN语义即可。

V3.1版本

CREATE TABLE users (
  user_id INT,
  user_name TEXT,
  PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');

CREATE TABLE orders (
  order_id INT,
  user_id INT,
  PRIMARY KEY (order_id)
)  WITH (binlog_level = 'replica');

INSERT INTO orders VALUES(1, 1);
CREATE DYNAMIC TABLE dt_join_2 WITH (
    auto_refresh_mode = 'incremental',
    freshness='10 minutes') 
AS 
SELECT order_id, orders.user_id, user_name 
-- FOR SYSTEM_TIME AS OF PROCTIME()用于标识users做为维表
FROM orders LEFT JOIN users FOR SYSTEM_TIME AS OF PROCTIME()
ON orders.user_id = users.user_id;

-- 刷新之后可以看到一条关联数据
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;
 order_id | user_id | user_name 
----------+---------+-----------
        1 |       1 | hologres
(1 row)


UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);

-- 刷新之后可以看到两条关联数据,维表更新只对新增数据生效,无法订正已关联数据
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;

返回结果如下:

 order_id | user_id |   user_name   
----------+---------+---------------
        1 |       1 | hologres
        4 |       1 | dynamic table
(2 rows)

V3.0版本

CREATE TABLE users (
  user_id INT,
  user_name TEXT,
  PRIMARY KEY (user_id)
);
INSERT INTO users VALUES(1, 'hologres');

CREATE TABLE orders (
  order_id INT,
  user_id INT,
  PRIMARY KEY (order_id)
)  WITH (binlog_level = 'replica');
INSERT INTO orders VALUES(1, 1);

CREATE DYNAMIC TABLE dt_join_2 WITH (refresh_mode = 'incremental') 
AS 
SELECT order_id, orders.user_id, user_name 
-- FOR SYSTEM_TIME AS OF PROCTIME()用于标识users做为维表
FROM orders LEFT JOIN users FOR SYSTEM_TIME AS OF PROCTIME()
ON orders.user_id = users.user_id;

-- 刷新之后可以看到一条关联数据
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;

order_id | user_id | user_name 
----------+---------+-----------
        1 |       1 | hologres
(1 row)
 
UPDATE users SET user_name = 'dynamic table' WHERE user_id = 1;
INSERT INTO orders VALUES(4, 1);

-- 刷新之后可以看到两条关联数据,维表更新只对新增数据生效,无法订正已关联数据
REFRESH TABLE dt_join_2;
SELECT * FROM dt_join_2;

返回结果如下:

 order_id | user_id |   user_name   
----------+---------+---------------
        1 |       1 | hologres
        4 |       1 | dynamic table
(2 rows)

增量消费湖表(Paimon)

增量刷新支持消费Paimon湖表,实现湖仓一体化。详情请参见使用Hologres完成湖上数据实时入仓以及聚合分析

全增量一体化刷新

当前增量Dynamic Table也支持全增量一体消费,即首先消费Query命中的基表全量数据,再消费基表新增的数据。

V3.1版本

V3.1版本,全增量一体化刷新默认开启。使用示例如下:

--准备基表,并开启binlog插入数据
CREATE TABLE base_sales(
  day TEXT NOT NULL,
  hour INT,
  user_id BIGINT,
  ts TIMESTAMPTZ,
  amount FLOAT,
  pk text NOT NULL PRIMARY KEY
);

-- 为基表导入数据
INSERT INTO base_sales values ('2024-08-29',1,222222,'2024-08-29 16:41:19.141528+08',5,'ddd');


-- 再为基表导入增量数据
INSERT INTO base_sales VALUES ('2024-08-29',2,3333,'2024-08-29 17:44:19.141528+08',100,'aaaaa');


-- 创建自动刷新的增量Dynamic Table,并开启全增量数据一体消费的GUC
CREATE DYNAMIC TABLE sales_incremental
  WITH (
    auto_refresh_mode='incremental',
    freshness='10 minutes'
  ) 
AS 
  SELECT day, hour, SUM(amount), COUNT(1) 
    FROM base_sales 
  GROUP BY day, hour;

对比数据一致性:

  • 查询基表

    SELECT day, hour, SUM(amount), COUNT(1) 
        FROM base_sales 
      GROUP BY day, hour;

    返回结果:

    day	    hour	sum	count
    2024-08-29	2	100	1
    2024-08-29	1	5	1
  • 查询Dynamic Table

    SELECT * FROM sales_incremental;

    返回结果:

    day	    hour	sum	count
    2024-08-29	1	5	1
    2024-08-29	2	100	1

V3.0版本

V3.0版本,需要开启GUC实现全增量一体化刷新。使用示例如下:

--准备基表,并开启binlog插入数据
CREATE TABLE base_sales(
  day TEXT NOT NULL,
  hour INT,
  user_id BIGINT,
  ts TIMESTAMPTZ,
  amount FLOAT,
  pk text NOT NULL PRIMARY KEY
);

-- 为基表导入数据
INSERT INTO base_sales values ('2024-08-29',1,222222,'2024-08-29 16:41:19.141528+08',5,'ddd');

-- 为基表打开Binlog
ALTER TABLE base_sales SET (binlog_level = replica);

-- 再为基表导入增量数据
INSERT INTO base_sales VALUES ('2024-08-29',2,3333,'2024-08-29 17:44:19.141528+08',100,'aaaaa');


-- 创建自动刷新的增量Dynamic Table,并开启全增量数据一体消费的GUC
CREATE DYNAMIC TABLE sales_incremental
  WITH (
    refresh_mode='incremental',
    incremental_auto_refresh_schd_start_time = 'immediate',
    incremental_auto_refresh_interval = '3 minutes',
    incremental_guc_hg_experimental_enable_hybrid_incremental_mode= 'true'
  ) 
AS 
  SELECT day, hour, SUM(amount), COUNT(1) 
    FROM base_sales 
  GROUP BY day, hour;

对比数据一致性:

  • 查询基表

    SELECT day, hour, SUM(amount), COUNT(1) 
        FROM base_sales 
      GROUP BY day, hour;

    返回结果:

    day	    hour	sum	count
    2024-08-29	2	100	1
    2024-08-29	1	5	1
  • 查询Dynamic Table

    SELECT * FROM sales_incremental;

    返回结果:

    day	    hour	sum	count
    2024-08-29	1	5	1
    2024-08-29	2	100	1

全量刷新

全量刷新会将Query中的数据以全量的方式写入Dynamic Table。相比于增量刷新,全量刷新的优势在于:

  • 支持更多的基表类型。

  • 支持更丰富的Query类型、算子支持等。

全量刷新相比增量刷新,处理的数据量更多,消耗的资源可能更多,因此更推荐的应用场景包括:定期报表查看、定期回刷数据等。

说明

更多关于全量刷新的信息请参见全量刷新

使用示例

V3.1版本

示例1:创建增量刷新Dynamic Table

执行下述操作前,请先参考一键导入公共数据集tpch_10g公共数据集的数据导入至Hologres。

说明

创建增量Dynamic Table之前,需要为基表开启Binlog(维表无需开启)。

--创建单表赠量刷新的dynamic table,并指定开始刷新时间,每3min刷新一次。
CREATE DYNAMIC TABLE public.tpch_q1_incremental 
WITH (
auto_refresh_mode='incremental',
freshness='3 minutes'
) AS SELECT
        l_returnflag,
        l_linestatus,
        COUNT(*) AS count_order
FROM
        hologres_dataset_tpch_10g.lineitem
WHERE
        l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
        l_returnflag,
        l_linestatus;

示例2:创建多表JOIN的增量刷新Dynamic Table

执行下述操作前,请先参考一键导入公共数据集tpch_10g公共数据集的数据导入至Hologres。

说明

在创建增量Dynamic Table之前,需要为基表开启Binlog(维表不需要开启)。

--创建多表join的增量刷新dynamic table
CREATE DYNAMIC TABLE dt_join
  WITH (
    auto_refresh_mode='incremental',
    freshness='30 minutes'
  ) 
AS 
SELECT
        l_shipmode,
        SUM(CASE
                WHEN o_orderpriority = '1-URGENT'
                        OR o_orderpriority = '2-HIGH'
                        THEN 1
                ELSE 0
        END) AS high_line_count,
        SUM(CASE
                WHEN o_orderpriority <> '1-URGENT'
                        AND o_orderpriority <> '2-HIGH'
                        THEN 1
                ELSE 0
        END) AS low_line_count
FROM
        hologres_dataset_tpch_10g.orders,
        hologres_dataset_tpch_10g.lineitem
WHERE
        o_orderkey = l_orderkey
        AND l_shipmode IN ('FOB', 'AIR')
        AND l_commitdate < l_receiptdate
        AND l_shipdate < l_commitdate
        AND l_receiptdate >= DATE '1997-01-01'
        AND l_receiptdate < DATE '1997-01-01' + INTERVAL '1' YEAR
GROUP BY
        l_shipmode;

示例3:创建自动刷新Dynamic Table

Dynamic Table设置为自动刷新,引擎自动选择刷新模式,优先使用增量刷新,若不支持增量刷新,则退化为全量刷新。

执行下述操作前,请先参考一键导入公共数据集tpch_10g公共数据集的数据导入至Hologres。

--创建自动刷新的dynamic table,引擎自动选择刷新模型。执行的结果是使用增量刷新模式
CREATE DYNAMIC TABLE thch_q6_auto
  WITH (
    auto_refresh_mode='auto',
    freshness='1 hours'
       ) 
AS
SELECT
        SUM(l_extendedprice * l_discount) AS revenue
FROM
        hologres_dataset_tpch_100g.lineitem
WHERE
        l_shipdate >= DATE '1996-01-01'
        AND l_shipdate < DATE '1996-01-01' + INTERVAL '1' YEAR
        AND l_discount BETWEEN 0.02 - 0.01 AND 0.02 + 0.01
        AND l_quantity < 24;

示例4:创建逻辑分区Dynamic Table

以实时交易大屏为例,业务通常会有近实时查看当天数据,同时又需要修正历史数据的实时离线一体化分析需求(详情请参见业务与数据认知)。我们通常使用Dynamic Table逻辑分区来实现该场景。具体方案如下:

  • 基表是按天分区,最新分区是Flink实时/近实时写入,历史分区数据从MaxCompute写入。

  • Dynamic Table基于基表创建,使用逻辑分区表,最新的2个分区是活跃分区,通过增量刷新模式刷新,满足业务的近实时数据分析需求

  • 历史分区是不活跃的分区,使用全量刷新模式,如果源表的历史分区有进行过数据修正/回刷,可以将历史分区使用全量刷新进行回刷

本示例使用Github公共数据集进行演示。

  1. 准备基表。

    基表的最新数据来源于Flink实时写入,详细操作流程请参见基于GitHub公开事件数据集的离线实时一体化实践

    DROP TABLE IF EXISTS gh_realtime_data;
    
    BEGIN;
    CREATE TABLE gh_realtime_data (
        id BIGINT,
        actor_id BIGINT,
        actor_login TEXT,
        repo_id BIGINT,
        repo_name TEXT,
        org_id BIGINT,
        org_login TEXT,
        type TEXT,
        created_at timestamp with time zone NOT NULL,
        action TEXT,
        iss_or_pr_id BIGINT,
        number BIGINT,
        comment_id BIGINT,
        commit_id TEXT,
        member_id BIGINT,
        rev_or_push_or_rel_id BIGINT,
        ref TEXT,
        ref_type TEXT,
        state TEXT,
        author_association TEXT,
        language TEXT,
        merged BOOLEAN,
        merged_at TIMESTAMP WITH TIME ZONE,
        additions BIGINT,
        deletions BIGINT,
        changed_files BIGINT,
        push_size BIGINT,
        push_distinct_size BIGINT,
        hr TEXT,
        month TEXT,
        year TEXT,
        ds TEXT,
        PRIMARY KEY (id,ds)
    )
    PARTITION BY LIST (ds);
    CALL set_table_property('public.gh_realtime_data', 'distribution_key', 'id');
    CALL set_table_property('public.gh_realtime_data', 'event_time_column', 'created_at');
    CALL set_table_property('public.gh_realtime_data', 'clustering_key', 'created_at');
    
    COMMENT ON COLUMN public.gh_realtime_data.id IS '事件ID';
    COMMENT ON COLUMN public.gh_realtime_data.actor_id IS '事件发起人ID';
    COMMENT ON COLUMN public.gh_realtime_data.actor_login IS '事件发起人登录名';
    COMMENT ON COLUMN public.gh_realtime_data.repo_id IS 'repoID';
    COMMENT ON COLUMN public.gh_realtime_data.repo_name IS 'repo名称';
    COMMENT ON COLUMN public.gh_realtime_data.org_id IS 'repo所属组织ID';
    COMMENT ON COLUMN public.gh_realtime_data.org_login IS 'repo所属组织名称';
    COMMENT ON COLUMN public.gh_realtime_data.type IS '事件类型';
    COMMENT ON COLUMN public.gh_realtime_data.created_at IS '事件发生时间';
    COMMENT ON COLUMN public.gh_realtime_data.action IS '事件行为';
    COMMENT ON COLUMN public.gh_realtime_data.iss_or_pr_id IS 'issue/pull_request ID';
    COMMENT ON COLUMN public.gh_realtime_data.number IS 'issue/pull_request 序号';
    COMMENT ON COLUMN public.gh_realtime_data.comment_id IS 'comment(评论)ID';
    COMMENT ON COLUMN public.gh_realtime_data.commit_id IS '提交记录ID';
    COMMENT ON COLUMN public.gh_realtime_data.member_id IS '成员ID';
    COMMENT ON COLUMN public.gh_realtime_data.rev_or_push_or_rel_id IS 'review/push/release ID';
    COMMENT ON COLUMN public.gh_realtime_data.ref IS '创建/删除的资源名称';
    COMMENT ON COLUMN public.gh_realtime_data.ref_type IS '创建/删除的资源类型';
    COMMENT ON COLUMN public.gh_realtime_data.state IS 'issue/pull_request/pull_request_review的状态';
    COMMENT ON COLUMN public.gh_realtime_data.author_association IS 'actorrepo之间的关系';
    COMMENT ON COLUMN public.gh_realtime_data.language IS '编程语言';
    COMMENT ON COLUMN public.gh_realtime_data.merged IS '是否接受合并';
    COMMENT ON COLUMN public.gh_realtime_data.merged_at IS '代码合并时间';
    COMMENT ON COLUMN public.gh_realtime_data.additions IS '代码增加行数';
    COMMENT ON COLUMN public.gh_realtime_data.deletions IS '代码减少行数';
    COMMENT ON COLUMN public.gh_realtime_data.changed_files IS 'pull request 改变文件数量';
    COMMENT ON COLUMN public.gh_realtime_data.push_size IS '提交数量';
    COMMENT ON COLUMN public.gh_realtime_data.push_distinct_size IS '不同的提交数量';
    COMMENT ON COLUMN public.gh_realtime_data.hr IS '事件发生所在小时,如0023分,hr=00';
    COMMENT ON COLUMN public.gh_realtime_data.month IS '事件发生所在月,如201510月,month=2015-10';
    COMMENT ON COLUMN public.gh_realtime_data.year IS '事件发生所在年,如2015年,year=2015';
    COMMENT ON COLUMN public.gh_realtime_data.ds IS '事件发生所在日,ds=yyyy-mm-dd';
    
    COMMIT;
  2. 创建Dynamic Table逻辑分区表。

    CREATE  DYNAMIC TABLE ads_dt_github_event
    LOGICAL PARTITION BY LIST(ds)
    WITH (
      -- dynamic table的属性
      freshness = '5 minutes', 
      auto_refresh_mode = 'auto', 
      auto_refresh_partition_active_time = '2 days' ,
      partition_key_time_format = 'YYYY-MM-DD'
    )
    AS
    SELECT
        repo_name,
        COUNT(*) AS events,
        ds
    FROM
        gh_realtime_data
    GROUP BY repo_name,ds
  3. 查询Dynamic Table。

    SELECT * FROM ads_dt_github_event ;
  4. 回刷历史分区。

    如果基表有历史数据变更,例如2025-04-01的数据有变更,Dynamic Table的数据需要同步更新,可以将Dynamic Table的历史分区设置成全量刷新模式,并结合Serverless执行一次刷新。

    REFRESH OVERWRITE DYNAMIC TABLE ads_dt_github_event
    PARTITION (ds = '2025-04-01') 
    WITH (
      refresh_mode = 'full'
    );

示例5:通过Dynamic Table增量刷新计算任意长周期UV计算

Hologres V3.1版本开始,Dynamic Table增量刷新支持RB_BUILD_AGG函数,以实现任意长周期的UV等计算,相比原预聚合方案,增量刷新的优势在于:

  • 更快的性能:每次计算时只需要计算增量的数据,计算性能更快。

  • 更低的成本:参与计算的数据量减少,使用的计算资源也随之减少,有效降低成本。可以支持更长周期的数据量计算。

示例如下

  1. 准备一张用户明细表。

    BEGIN;
    CREATE TABLE IF NOT EXISTS ods_app_detail (
         uid INT,
         country TEXT,
         prov TEXT,
         city TEXT,
         channel TEXT,
         operator TEXT,
         brand TEXT,
         ip TEXT,
         click_time TEXT,
         year TEXT,
         month TEXT,
         day TEXT,
         ymd TEXT NOT NULL
    );
    CALL set_table_property('ods_app_detail', 'orientation', 'column');
    CALL set_table_property('ods_app_detail', 'bitmap_columns', 'country,prov,city,channel,operator,brand,ip,click_time, year, month, day, ymd');
    --distribution_key根据需求设置,根据该表的实时查询需求,从什么维度做分片能够取得较好效果即可
    CALL set_table_property('ods_app_detail', 'distribution_key', 'uid');
    --用于做where过滤条件,包含完整年月日时间字段推荐设为clustering_keyevent_time_column
    CALL set_table_property('ods_app_detail', 'clustering_key', 'ymd');
    CALL set_table_property('ods_app_detail', 'event_time_column', 'ymd');
    COMMIT;
  2. 通过Dynamic Table增量刷新计算UV。

    CREATE DYNAMIC TABLE ads_uv_dt
      WITH (
        freshness = '5 minutes', 
        auto_refresh_mode = 'incremental') 
      AS 
    SELECT  
     RB_BUILD_AGG(uid),
     country,
     prov,
     city,
     ymd,
    COUNT(1)
    FROM    ods_app_detail
    WHERE ymd >= '20231201' AND ymd <='20240502'
    GROUP BY country,prov,city,ymd;
  3. 查询任意周期的UV。

    SELECT  
    RB_CARDINALITY(RB_OR_AGG(rb_uid)) AS uv,
      country,
      prov,
      city,
      SUM(pv) AS pv
    FROM    ads_uv_dt
    WHERE   ymd = '20240329'
    GROUP BY country,prov,city;

V3.0版本

示例1:创建全量刷新Dynamic Table并自动开始执行刷新

执行下述操作前,请先参考一键导入公共数据集tpch_10g公共数据集的数据导入至Hologres。

--创建 “test” Schema
CREATE SCHEMA test;

--创建单表全量刷新的dynamic table,并立即开始刷新,每1小时刷新一次。
CREATE DYNAMIC TABLE test.thch_q1_full
  WITH (
    refresh_mode='full',
    auto_refresh_enable='true',
    full_auto_refresh_interval='1 hours',
    full_guc_hg_computing_resource='serverless',
    full_guc_hg_experimental_serverless_computing_required_cores='32'
       ) 
AS
  SELECT
        l_returnflag,
        l_linestatus,
        SUM(l_quantity) AS sum_qty,
        SUM(l_extendedprice) AS sum_base_price,
        SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
        SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
        AVG(l_quantity) AS avg_qty,
        AVG(l_extendedprice) AS avg_price,
        AVG(l_discount) AS avg_disc,
        COUNT(*) AS count_order
FROM
        hologres_dataset_tpch_10g.lineitem
WHERE
        l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
        l_returnflag,
        l_linestatus;

示例2:创建增量刷新的Dynamic Table并指定开始刷新时间

执行下述操作前,请先参考一键导入公共数据集tpch_10g公共数据集的数据导入至Hologres。

创建增量Dynamic Table示例如下:

说明

在创建增量Dynamic Table之前,需要为基表开启Binlog(维表不需要开启)。

--为基表开binlog:
BEGIN;
CALL set_table_property('hologres_dataset_tpch_10g.lineitem', 'binlog.level', 'replica');
COMMIT;

--创建单表赠量刷新的dynamic table,并指定开始刷新时间,每3min刷新一次
CREATE DYNAMIC TABLE public.tpch_q1_incremental 
WITH (
refresh_mode='incremental',
auto_refresh_enable='true',
incremental_auto_refresh_schd_start_time='2024-09-15 23:50:0',
incremental_auto_refresh_interval='3 minutes',
incremental_guc_hg_computing_resource='serverless',
incremental_guc_hg_experimental_serverless_computing_required_cores='30'
) AS SELECT
        l_returnflag,
        l_linestatus,
        COUNT(*) AS count_order
FROM
        hologres_dataset_tpch_10g.lineitem
WHERE
        l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
        l_returnflag,
        l_linestatus
;

示例3:创建多表JOIN的全量刷新Dynamic Table

--创建query为多表join的dynamic table,全量刷新模式,每3小时刷新一次。
CREATE DYNAMIC TABLE dt_q_full
  WITH (
    refresh_mode='full',
    auto_refresh_enable='true',
    full_auto_refresh_schd_start_time='immediate',
    full_auto_refresh_interval='3 hours',
    full_guc_hg_computing_resource='serverless',
    full_guc_hg_experimental_serverless_computing_required_cores='64'
  ) 
AS 
SELECT
        o_orderpriority,
        COUNT(*) AS order_count
FROM
        hologres_dataset_tpch_10g.orders
WHERE
        o_orderdate >= DATE '1996-07-01'
        AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH
        AND EXISTS (
                SELECT
                        *
                FROM
                        hologres_dataset_tpch_10g.lineitem
                WHERE
                        l_orderkey = o_orderkey
                        AND l_commitdate < l_receiptdate
        )
GROUP BY
        o_orderpriority;

示例4:创建维表JOIN的增量刷新Dynamic Table

创建维表JOIN的增量Dynamic Table示例如下:

说明

在创建增量Dynamic Table之前,需要为基表开启Binlog(维表不需要开启)。

维表JOIN的语义是:对每条数据,只会关联当时维表的最新版本数据,即JOIN行为只发生在处理时间(Processing Time)。如果JOIN行为发生后,维表中的数据发生了变化(新增、更新或删除),则已关联的维表数据不会被同步变化。SQL示例如下:

--明细表
BEGIN;
CREATE TABLE public.sale_detail(
        app_id TEXT,
        uid TEXT,
        product TEXT,
        gmv BIGINT,
        order_time TIMESTAMPTZ
);
--为基表开binlog,维表不需要开启
CALL set_table_property('public.sale_detail', 'binlog.level', 'replica');
COMMIT;

--属性表
CREATE TABLE public.user_info(
        uid TEXT,
        province TEXT,
        city TEXT
);

CREATE DYNAMIC TABLE public.dt_sales_incremental
  WITH (
    refresh_mode='incremental',
    auto_refresh_enable='true',
    incremental_auto_refresh_schd_start_time='2024-09-15 00:00:00',
    incremental_auto_refresh_interval='5 minutes',
    incremental_guc_hg_computing_resource='serverless',
    incremental_guc_hg_experimental_serverless_computing_required_cores='128') 
AS 
SELECT 
    sale_detail.app_id,
    sale_detail.uid,
    product,
    SUM(sale_detail.gmv) AS sum_gmv,
    sale_detail.order_time,
    user_info.province,
    user_info.city 
FROM public.sale_detail 
INNER JOIN public.user_info  FOR SYSTEM_TIME AS OF PROCTIME()
ON sale_detail.uid =user_info.uid
GROUP BY sale_detail.app_id,sale_detail.uid,sale_detail.product,sale_detail.order_time,user_info.province,user_info.city;

示例5:创建分区Dynamic Table

以实时交易大屏为例,业务通常会有近实时查看当天数据,同时又需要修正历史数据的需求。在这种场景下,我们通常使用Dynamic Table增量刷新和全量刷新来实现。做法如下:

  1. 创建分区表作为基表,最新分区采用实时/近实时写入方式,历史分区偶尔有数据修正的操作。

  2. 创建Dynamic Table,将其作为分区父表,最新的分区使用增量刷新模式,满足业务的近实时数据分析需求。

  3. 将历史分区切换成全量刷新模式,如果源表的历史分区进行过数据修正/回刷,则Dynamic Table的历史分区也可以使用全量刷新模式进行一次回刷,同时建议结合Serverless提升回刷速度。

示例如下

  1. 准备基表和数据。

    基表为分区表,最新分区采用实时数据写入方式。

    -- 创建分区源表
    CREATE TABLE base_sales(
      uid INT,
      opreate_time TIMESTAMPTZ,
      amount FLOAT,
      tt TEXT NOT NULL,
      ds TEXT,
      PRIMARY KEY(ds)
    ) PARTITION BY LIST (ds) ;
    
    --历史分区
    CREATE TABLE base_sales_20240615 PARTITION OF base_sales FOR VALUES IN ('20240615');
    INSERT INTO base_sales_20240615 VALUES (2,'2024-06-15 16:18:25.387466+08','111','2','20240615');
    
    --最新分区,一般是实时写入
    CREATE TABLE base_sales_20240616 PARTITION OF base_sales FOR VALUES IN ('20240616');
    INSERT INTO base_sales_20240616 VALUES (1,'2024-06-16 16:08:25.387466+08','2','1','20240616');
  2. 创建Dynamic Table分区父表,父表只设置Query的定义,不设置刷新模式。

    --创建extension
    CREATE EXTENSION roaringbitmap;
    
    CREATE DYNAMIC TABLE partition_dt_base_sales
    PARTITION BY LIST (ds)
    as
    SELECT  
     public.RB_BUILD_AGG(uid),
     opreate_time,
     amount,
     tt,
     ds,
    COUNT(1)
    FROM    base_sales
    GROUP BY opreate_time ,amount,tt,ds;
  3. 创建子表,并为子表设置刷新模式。

    您可手动创建Dynamic Table分区子表,也可以使用DataWorks数据开发动态创建Dynamic Table分区子表。最新分区创建为增量刷新模式,历史分区设置为全量刷新模式。

    -- 为基表打开Binlog
    ALTER TABLE base_sales SET (binlog_level = replica);
    
    -- 假设历史Dynamic Table分区子表如下:
    CREATE DYNAMIC TABLE partition_dt_base_sales_20240615 PARTITION OF partition_dt_base_sales FOR VALUES IN ('20240615')
      WITH (
        refresh_mode='incremental',
        auto_refresh_enable='true',
        incremental_auto_refresh_schd_start_time='immediate',
        incremental_auto_refresh_interval='30 minutes'
           );
    
    -- 创建新的Dynamic Table分区子表,并指定最新分区的刷新模式为增量刷新,建表成功后立即开始启动刷新,刷新间隔为30分钟,并使用本实例资源刷新。
    CREATE DYNAMIC TABLE partition_dt_base_sales_20240616 PARTITION OF partition_dt_base_sales FOR VALUES IN ('20240616')
      WITH (
        refresh_mode='incremental',
        auto_refresh_enable='true',
        incremental_auto_refresh_schd_start_time='immediate',
        incremental_auto_refresh_interval='30 minutes'
           );
    
    --将历史分区转换为全量刷新模式
    ALTER DYNAMIC TABLE partition_dt_base_sales_20240615 SET (refresh_mode = 'full');
    --如果历史分区需要数据订正,可以执行一次refresh,建议配合serverless来执行。
    SET hg_computing_resource = 'serverless';
    REFRESH DYNAMIC TABLE partition_dt_base_sales_20240615;

语法转换命令

Hologres 自V3.1版本开始,Dynamic Table的语法有所升级。当您从V3.0版本升级后,需要使用V3.1语法重新建表,Hologres提供语法转换工具,方便您更加简便的完成语法转换。

需重新建表场景

  • 增量刷新的Dynamic Table:若是Dynamic Table是增量刷新,则必须重新创建。

  • 升级检查中语法不兼容,必须重新建表,具体情况需以升级检查报告为准。

说明

通过V3.0语法创建的Dynamic Table除以上场景外,可以不需要重新创建,但只能对表执行ALTER,不能使用V3.0版本语法建表。

转换语法命令的适用场景

仅适用于非分区表(刷新模式包含增量刷新和全量刷新),如果您在V3.0版本是Dynamic Table分区表,需要手动重建,并建议您使用Dynamic Table逻辑分区。

转换语法命令的使用

在使用转换语法命令需注意以下情况:

  • Hologres V3.1.11及以上版本支持该命令语法。

  • 需要表OwnerSuperuser执行该命令。

  • 执行完成后,如果表开启了自动刷新,将会继续启动自动刷新。

转换语法的命令如下:

--仅适用于非分区表(刷新模式包含全量刷新和增量刷新),分区表请手动重新创建,并建议使用逻辑分区。
CALL hg_upgrade_all_normal_dynamic_tables();

语法参数映射

使用语法转换命令,V3.0版本和V3.1版本的参数以及对应的值映射如下:

V3.0版本参数名

V3.1版本参数名

说明

refresh_mode

auto_refresh_mode

转换后与转换前参数值保持一致。例如:转换前配置为refresh_mode='incremental',转换后为auto_refresh_mode='incremental'

auto_refresh_enable

auto_refresh_enable

参数值保持一致。

{refresh_mode}_auto_refresh_schd_start_time

freshness

auto_refresh_interval的值将会为转换为freshness的值。

例如:转换前配置为full_auto_refresh_interval='30 minutes',转换后为freshness='30 minutes'

{refresh_mode}_auto_refresh_interval

{refresh_mode}_guc_hg_computing_resource

computing_resource

转换后与转换前参数值保持一致。例如:转换前配置为full_guc_hg_computing_resource='serverless',转换后为computing_resource='serverless'

{refresh_mode}_guc_hg_experimental_serverless_computing_required_cores

refresh_guc_hg_experimental_serverless_computing_required_cores

转换后与转换前参数值保持一致。

{refresh_mode}_guc_<guc>

refresh_guc_<guc_name>

转换后与转换前参数值保持一致。例如:转换前配置为

incremental_guc_hg_experimental_max_consumed_rows_per_refresh='1000000',转换后为refresh_guc_hg_experimental_max_consumed_rows_per_refresh='1000000'

orientation等表属性

orientation等表属性

表的基本属性都会保持不变。

下一步:管理Dynamic Table

Dynamic Table创建成功后,您可以执行如下操作: