各类表的能力对比
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 BY 和 DUPLICATE 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 |
| 不支持 | ||
DML DELETE |
|
|