您可以使用Dynamic Table实现更高效、低成本的数据自动流动与分层,本文为您介绍Dynamic Table的支持范围与使用限制。
增量刷新
如果Dynamic Table设置的是增量刷新模式,支持的功能和使用限制如下:
使用限制
- 资源使用说明 - V3.1版本开始,新建表默认使用serverless资源执行刷新任务,如果该实例没有开启serverless,将会自动切换为local资源。V3.0版本中创建的表仍然使用表创建时设置的刷新资源,不会默认变更为serverless。 
- 基表的限制 - 仅支持Hologres内部表、Paimon外部表和Dynamic Table,创建Dynamic Table时需要有对应基表的访问权限。 
- V3.1版本:默认使用Stream方式增量消费基表的数据,相比Binlog方式,Stream的性能更好,也没有额外的存储成本。如果您的基表在V3.1版本之前是使用Binlog方式,建议及时关闭Binlog,以防止增加额外的存储。关闭Binlog操作见订阅Hologres Binlog。 
- V3.0版本:创建增量Dynamic Table时,基表必须开启Binlog,维表无需开启。开启Binlog的操作请参见订阅Hologres Binlog。 
 
- Query的限制 - 支持任意标量表达式。 
- 支持WHERE条件、子查询、CTE、GROUP BY、CUBE、GROUPING SETS、HAVING语句、Agg Filter、UNION ALL、UNNEST。 
- 不支持窗口函数、IN子查询、EXISTS或NOT EXISTS、EXCEPT或INTERSECT、ORDER BY、LIMIT或OFFSET。 
- 多表JOIN: - V3.0版本仅支持维表等值JOIN(INNER JOIN/LEFT JOIN),且必须使用 - FOR SYSTEM_TIME AS OF PROCTIME()的方式。不支持多表双流JOIN,详情请参见维表JOIN语句。说明- 维表JOIN的语义是:对每条数据,只会关联当时维表的最新版本数据,即JOIN行为只发生在处理时间(Processing Time)。如果JOIN行为发生后,维表中的数据发生了变化(新增、更新或删除),则已关联的维表数据不会被同步更新。 
- 从V3.0.26版本开始,支持多表双流JOIN,即OLAP中的普通JOIN,或者Flink中的双流JOIN,包括INNER JOIN、LEFT/RIGHT/FULL OUTER JOIN。详情请参见CREATE DYNAMIC TABLE。 
 
- 函数:支持COUNT、SUM、MIN/MAX、COUNT DISTINCT等聚合函数。更多函数支持情况如下: - 函数名 - 语法格式 - Dynamic Table使用示例 - 支持的版本 - RB_BUILD_AGG - RB_BUILD_AGG(<column>)说明- column的参数类型支持int32和int64,详细使用请参见RoaringBitmap函数。 - CREATE DYNAMIC TABLE daily_uv PARTITION BY list (day) WITH ( freshness = '5 minutes', refresh_mode = 'incremental') AS SELECT day, game_id, gameversion, RB_BUILD_AGG(user_id) AS user_rb FROM base_table GROUP BY day, game_id, gameversion;- V3.1及以上版本。 - STRING_AGG - STRING_AGG([DISTINCT] column_expr, const_expr)说明- 参数类型:column_expr需为TEXT/CHAR/VARCHAR类型,const_expr需为TEXT类型的常量。 
- 不支持使用ORDER BY语法。 
- 自Hologres V3.1.10版本开始,支持 - STRING_AGG([DISTINCT]。
 - CREATE DYNAMIC TABLE string_agg_test_dt WITH ( freshness = '3 minutes', refresh_mode = 'incremental') AS SELECT day, STRING_AGG(gameversion, ',') AS gameversion_list FROM base_table GROUP BY day;- V3.1及以上版本。 
- V3.1.10版本开始,支持 - STRING_AGG([DISTINCT]。
 - ARRAY_AGG - ARRAY_AGG([DISTINCT] expr)说明- expr参数类型:支持BOOL类型、所有数字类型、TEXT类型、BYTEA类型。 
- 不支持使用ORDER BY语法。 
- 自Hologres V3.1.10版本开始,支持 - ARRAY_AGG([DISTINCT]。
 - CREATE DYNAMIC TABLE array_agg_test_dt WITH ( freshness = '3 minutes', refresh_mode = 'incremental') AS SELECT day, ARRAY_AGG(gameversion) AS gameversion_list FROM base_table GROUP BY day;- V3.1及以上版本。 
- 自Hologres V3.1.10版本开始,支持 - ARRAY_AGG([DISTINCT]。
 - ANY_VALUE - 在包含 - GROUP BY的聚合查询中,从每个聚合分组中随机选择某行的结果返回,结果不确定。- ANY_VALUE(expr)- ANY_VALUE的输入参数仅支持INT和BINARY类型。- CREATE DYNAMIC TABLE dt_t0 WITH ( -- dynamic table的属性 freshness = '1 minutes', auto_refresh_mode = 'auto' ) AS SELECT a,any_value(c),SUM(b) FROM t0 GROUP BY a;- V3.1.5及以上版本支持。 
- 从V3.1版本开始,支持将Dynamic Table设置为逻辑分区,支持逻辑分区相关的分区属性和分区管理设置。 
 
全量刷新
如果Dynamic Table设置的是全量刷新模式,支持的功能和使用限制如下:
支持的功能
- 基表的支持:与普通Hologres表的功能相同,支持Hologres内部表、外部表(MaxCompute、DLF和Paimon等)作为Dynamic Table的基表,创建Dynamic Table时需要具备对应基表的访问权限,详情请参见Dynamic Table权限。 
- Query的支持:当前Hologres支持的函数、SQL表达式、数据类型等,全量刷新模式都能支持。 
- 刷新资源的支持:默认使用Serverless资源执行刷新任务,您也可以调整为本实例资源。 
使用限制
不支持将全量刷新模式转换为增量刷新模式。
通用限制
Dynamic Table本身的限制
对Dynamic Table执行DDL、DML等操作的限制
| 操作 | 是否支持 | 
| CREATE DYNAMIC TABLE | 是 | 
| RENAME DYNAMIC TABLE | 是 | 
| RENAME DYNAMIC TABLE Column | 是 | 
| SELECT | 是 | 
| Refresh | 
 | 
| DROP DYNAMIC TABLE | 是 | 
| DROP DYNAMIC TABLE Column | 否 | 
| TRUNCATE DYNAMIC TABLE | 否 | 
| DML(INSERT/UPDATE/DELETE) DYNAMIC TABLE | 否 | 
| ADD Column | 否 | 
| Resharding | 否 | 
| CREATE TABLE AS/LIKE | 否 | 
使用Dynamic Table的相关权限要求
| 操作 | 权限要求 | 
| CREATE DYNAMIC TABLE | 
 | 
| ALTER DYNAMIC TABLE | 
 | 
| DROP DYNAMIC TABLE | Dynamic Table的表Owner。 | 
| SELECT DYNAMIC TABLE | Dynamic Table的Select权限。 | 
| REFRESH DYNAMIC TABLE | Dynamic Table的DML权限。 说明  不支持Refresh分区父表。 | 
对Dynamic Table的授权,详情请参见Hologres权限模型。
基表操作对Dynamic Table的影响
| 基表操作 | Dynamic Table的表现 | 
| RENAME <basetable_name> | 
 | 
| RENAME <基表中Dynamic Table未使用的列名> | 
 | 
| RENAME <基表中Dynamic Table使用的列名> | 
 | 
| DROP <basetable_name> | 
 | 
| DROP <basetable_name> CASCADE | Dynamic Table一并被删除,任务也被取消。 | 
| DROP <基表中Dynamic Table未使用的列> | 
 | 
| DROP <基表中Dynamic Table使用的列> | DROP报错。 | 
| TRUNCATE <basetable_name> | 
 | 
| INSERT/DELETE/UPDATE/UPSERT <basetable_name> | INSERT/DELETE/UPDATE/UPSERT Dynamic Table。 |