Dynamic Table支持范围和限制

您可以使用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子查询、EXISTSNOT EXISTS、EXCEPTINTERSECT、ORDER BY、LIMITOFFSET。

    • 多表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的参数类型支持int32int64,详细使用请参见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(column_expr, const_expr)
      说明
      • 参数类型:column_expr需为TEXT/CHAR/VARCHAR类型,const_expr需为TEXT类型的常量。

      • 不支持使用ORDER BY语法。

      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及以上版本。

      ARRAY_AGG

      ARRAY_AGG(expr)
      说明
      • expr参数类型:支持BOOL类型、所有数字类型、TEXT类型、BYTEA类型。

      • 不支持使用ORDER BY语法。

      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及以上版本。

    • V3.1版本开始,支持将Dynamic Table设置为逻辑分区,支持逻辑分区相关的分区属性和分区管理设置。

全量刷新

如果Dynamic Table设置的是全量刷新模式,支持的功能和使用限制如下:

支持的功能

  • 基表的支持:与普通Hologres表的功能相同,支持Hologres内部表、外部表(MaxCompute、DLFPaimon等)作为Dynamic Table的基表,创建Dynamic Table时需要具备对应基表的访问权限,详情请参见Dynamic Table权限

  • Query的支持:当前Hologres支持的函数、SQL表达式、数据类型等,全量刷新模式都能支持。

  • 刷新资源的支持:默认使用Serverless资源执行刷新任务,您也可以调整为本实例资源。

使用限制

不支持将全量刷新模式转换为增量刷新模式。

通用限制

Dynamic Table本身的限制

  • Hologres实例必须为V3.0及以上版本。

  • Dynamic Table表属性的限制:不支持设置主键、字段默认值,引擎会自动推导表的索引,您也可以根据业务情况自行设置。

  • 仅支持全量刷新和增量刷新两种模式,不同模式的支持范围和使用限制不同,具体请参见全量刷新增量刷新

Dynamic Table执行DDL、DML等操作的限制

操作

是否支持

CREATE DYNAMIC TABLE

RENAME DYNAMIC TABLE

RENAME DYNAMIC TABLE Column

SELECT

Refresh

  • 支持Refresh非分区表和分区子表。

  • 不支持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

  • Create Table权限。

  • 基表的Select权限。

ALTER DYNAMIC TABLE

  • Create Table权限。

  • 基表的Select权限。

DROP DYNAMIC TABLE

Dynamic Table的表Owner。

SELECT DYNAMIC TABLE

Dynamic TableSelect权限。

REFRESH DYNAMIC TABLE

Dynamic TableDML权限。

说明

不支持Refresh分区父表。

Dynamic Table的授权,详情请参见Hologres权限模型

基表操作对Dynamic Table的影响

基表操作

Dynamic Table的表现

RENAME <basetable_name>

  • 查询Dynamic Table正常执行。

  • Refresh报错。

RENAME <基表中Dynamic Table未使用的列名>

  • 查询Dynamic Table正常执行。

  • Refresh正常执行。

RENAME <基表中Dynamic Table使用的列名>

  • 查询Dynamic Table正常执行。

  • Refresh正常执行。

DROP <basetable_name>

  • DROP报错。

  • Dynamic Table正常执行。

DROP <basetable_name> CASCADE

Dynamic Table一并被删除,任务也被取消。

DROP <基表中Dynamic Table未使用的列>

  • 查询Dynamic Table正常执行。

  • Refresh正常执行。

DROP <基表中Dynamic Table使用的列>

DROP报错。

TRUNCATE <basetable_name>

  • Dynamic Table执行RefreshTRUNCATE 基表,查询Dynamic Table有数据。

  • Dynamic Table执行RefreshTRUNCATE 基表,查询Dynamic Table没数据。

INSERT/DELETE/UPDATE/UPSERT <basetable_name>

INSERT/DELETE/UPDATE/UPSERT Dynamic Table。