跳到主要内容
版本:Candidate-3.3

各类表的能力对比

Key 列和排序键

主键表 (Primary Key table)明细表 (Duplicate Key table)聚合表 (Aggregate table)更新表 (Unique Key table)
Key 列和唯一约束主键 PRIMARY KEY 具有唯一约束和非空约束。DUPLICATE KEY 不具有唯一约束。聚合键 AGGREGATE KEY 具有唯一约束。唯一键 UNIQUE KEY 具有唯一约束。
Key 列和数据变更的关系(逻辑关系)基于主键对数据进行增删改操作。如果新数据的主键值与表中原数据的主键值相同,则存在唯一约束冲突,此时新数据会替代原数据。
与更新表相比,主键表增强了其底层存储引擎,已经可以取代更新表。
Duplicate Key 不具有唯一约束,因此如果新数据的 Duplicate Key 与表中原数据相同,则新旧数据都会存在表中。基于聚合键对数据进行增删改操作。如果新数据与表中原数据存在唯一约束冲突,则会根据聚合键和 Value 列的聚合函数聚合新旧数据。基于唯一键对数据进行增删改操作。如果新数据与表中原数据存在唯一约束冲突,则新数据会替代原数据。
更新表实际可以视为聚合函数为 replace 的聚合表。
Key 列和排序键的关系自 3.0.0 起,主键表中两者解耦。主键表支持使用 ORDER BY 指定排序键和使用 PRIMARY KEY 指定主键。自 3.3.0 起,明细表支持使用 ORDER BY 指定排序键,如果同时使用 ORDER BYDUPLICATE KEY,则 DUPLICATE KEY 无效。自 3.3.0 起,聚合表中两者解耦。聚合表支持使用 ORDER BY 指定排序键和使用 AGGREGATE KEY 指定聚合键。排序键和聚合键中的列需要保持一致,但是列的顺序不需要保持一致。自 3.3.0 起,更新表中两者解耦。更新表支持使用 ORDER BY 指定排序键和使用 UNIQUE KEY 指定唯一键。排序键和唯一键中的列需要保持一致,但是列的顺序不需要保持一致。
Key 列和排序键支持的数据类型数值(包括整型、布尔)、字符串、时间日期。数值(包括整型、布尔、Decimal)、字符串、时间日期。
Key 和分区/分桶列的关系分区列、分桶列必须在主键中。分区列、分桶列必须在聚合键中。分区列、分桶列必须在唯一键中。

Key 列和 Value 列的数据类型

表中 Key 列支持数据类型为数值(包括整型、布尔和 DECIMAL)、字符串、时间日期。

备注

主键表的 Key 列不支持为 DECIMAL。

而表中 Value 列支持基础的数据类型,包括数值、字符串、时间日期。不同类型的表中 Value 列对于 BITMAP、HLL 以及半结构化类型的支持度不同,具体如下:

主键表 (Primary Key table)明细表 (Duplicate Key table)聚合表 (Aggregate table)更新表 (Unique Key table)
BITMAP支持不支持支持。聚合函数必须为 bitmap_union、replace 或者 replace_if_not_null。支持
HLL支持不支持支持。聚合函数必须为 hll_union、replace 或者replace_if_not_null。支持
PERCENTILE支持不支持支持。聚合函数必须为 percentile_union、replace 或者 replace_if_not_null。支持
半结构化类型: JSON/ARRAY/MAP/STRUCT支持支持支持。聚合函数必须为 replace 或者 replace_if_not_null。支持

数据变更

主键表 (Primary Key table)明细表 (Duplicate Key table)聚合表 (Aggregate table)更新表 (Unique Key table)
导入数据时实现 INSERT支持。在导入任务中配置 __op=0 实现 INSERT。内部实现时,StarRocks 将 INSERT 和 UPDATE 操作均视为 UPSERT 操作。支持支持(同聚合键值的数据行会聚合)支持(同唯一键值的数据行会更新)
导入数据时实现 UPDATE不支持支持(使用 Replace 聚合函数实现)支持(更新表本身就可以视为使用 Replace 聚合函数的聚合表)
导入数据时实现 DELETE支持。在导入任务中配置 __op=1 实现 DELETE不支持不支持不支持
导入数据列值的完整性默认必须导入全部列值。如果开启部分列更新partial_update,或者列具有默认值,则无需导入全部列值。默认必须导入全部列值。如果列具有默认值,则无需导入全部列值。默认必须导入全部列值。不过,聚合表可以通过指定 Value 列的聚合函数为 REPLACE_IF_NOT_NULL 实现部分列更新,具体使用方式,请参见 aggr_type。并且如果列具有默认值,也无需导入全部列值。默认必须导入全部列值。如果列具有默认值,则无需导入全部列值。
DML INSERT支持
DML UPDATE
  • Key 列作为过滤条件:支持
  • Value 列作为过滤条件:支持
不支持
DML DELETE
  • Key 列作为过滤条件:支持
  • Value 列作为过滤条件:支持
  • Key 列作为过滤条件:支持
  • Value 列作为过滤条件:支持。
注意,仅支持基于 Key 或 Value 列本身的简单过滤条件,如 =、<、>,不支持复杂条件,如函数、子查询。
  • Key 列作为过滤条件:支持。注意,仅支持基于 Key 列本身的简单过滤条件,如 =、<、>,不支持复杂条件,如函数、子查询。
  • Value 列作为过滤条件:不支持

和其他功能的兼容性

主键表 (Primary Key table)明细表 (Duplicate Key table)聚合表 (Aggregate table)更新表 (Unique Key table)
Bitmap 索引/Bloom filer 索引基于 Key 列构建索引支持
基于 Value 列构建索引支持支持不支持不支持
分区/分桶表达式分区/List 分区支持
随机分桶不支持自 3.1 起,支持不支持不支持
物化视图异步物化视图支持
同步物化视图不支持支持支持支持
其他功能CTAS支持支持不支持不支持
Backup & restore自 2.5 起,支持支持