StarRocks表类型能力全面解析:关键特性与使用场景
前言
在StarRocks分布式分析型数据库中,表设计是影响查询性能和数据管理效率的关键因素。StarRocks提供了四种主要的表类型:主键表(Primary Key)、重复键表(Duplicate Key)、聚合表(Aggregate)和唯一键表(Unique Key)。本文将深入解析这四种表类型的关键能力差异,帮助用户根据业务场景选择最合适的表类型。
一、键列与排序键特性对比
1.1 键列约束特性
| 特性 | 主键表 | 重复键表 | 聚合表 | 唯一键表 |
|---|---|---|---|---|
| 唯一约束 | 主键具有UNIQUE和NOT NULL约束 | 无唯一约束 | 聚合键具有唯一约束 | 唯一键具有唯一约束 |
| 数据变更逻辑 | 主键冲突时新行替换旧行 | 允许键值重复,保留所有行 | 键值相同时按聚合函数合并 | 键值冲突时新行替换旧行 |
| 键列数据类型 | 数值、字符串、日期(DATE/DATETIME) | 数值、字符串、日期(DATE/DATETIME)、DECIMAL | 数值、字符串、日期(DATE/DATETIME)、DECIMAL | 数值、字符串、日期(DATE/DATETIME)、DECIMAL |
技术要点:
- 主键表在存储引擎层面进行了优化,性能优于唯一键表
- 聚合表可视为使用特定聚合函数的特殊唯一键表
- 主键表不支持DECIMAL类型的键列,而其他表类型支持
1.2 排序键与键列关系演进
从StarRocks 3.0版本开始,各表类型逐步实现了排序键与键列的分离:
- 主键表:3.0+版本排序键与主键解耦
- 重复键表:3.3+版本支持通过
ORDER BY指定排序键 - 聚合表:3.3+版本支持分别指定排序键(
ORDER BY)和聚合键(AGGREGATE KEY) - 唯一键表:3.3+版本支持分别指定排序键(
ORDER BY)和唯一键(UNIQUE KEY)
设计建议:
- 对于频繁范围查询的场景,可单独设计排序键优化查询性能
- 键列和排序键的列集合需要相同,但顺序可以不同
二、列数据类型支持矩阵
2.1 键列与值列数据类型
键列支持:
- 数值类型(整型、BOOLEAN、DECIMAL)
- 字符串类型
- 日期类型(DATE/DATETIME)
值列支持:
- 所有基本数据类型
- 特殊类型支持情况如下表:
| 类型 | 主键表 | 重复键表 | 聚合表 | 唯一键表 |
|---|---|---|---|---|
| BITMAP | 支持 | 不支持 | 需配合bitmap_union/replace函数 | 支持 |
| HLL | 支持 | 不支持 | 需配合hll_union/replace函数 | 支持 |
| PERCENTILE | 支持 | 不支持 | 需配合percentile_union/replace函数 | 支持 |
| JSON/ARRAY/MAP/STRUCT | 支持 | 支持 | 需配合replace函数 | 支持 |
使用建议:
- 需要高级聚合计算时优先考虑主键表或聚合表
- 半结构化数据在各表类型中都有良好支持
三、数据变更操作支持情况
3.1 数据加载操作
| 操作 | 主键表 | 重复键表 | 聚合表 | 唯一键表 |
|---|---|---|---|---|
| INSERT | 支持(通过__op=0配置) | 支持 | 支持(自动聚合) | 支持(自动更新) |
| UPDATE | 支持(视为UPSERT) | 不支持 | 通过replace函数实现 | 内置支持 |
| DELETE | 支持(通过__op=1配置) | 不支持 | 不支持 | 不支持 |
3.2 列值完整性要求
| 表类型 | 默认要求 | 例外情况 |
|---|---|---|
| 主键表 | 需加载所有列值 | 1. 启用partial_update 2. 列有默认值 |
| 重复键表 | 需加载所有列值 | 列有默认值 |
| 聚合表 | 需加载所有列值 | 1. 使用REPLACE_IF_NOT_NULL函数 2. 列有默认值 |
| 唯一键表 | 需加载所有列值 | 列有默认值 |
3.3 DML操作支持
- INSERT:所有表类型均支持
- UPDATE:
- 主键表:全面支持键列/值列作为过滤条件
- 其他表类型:不支持
- DELETE:
- 主键表:全面支持复杂条件删除
- 重复键表:支持简单键列/值列条件
- 聚合表/唯一键表:仅支持简单键列条件
最佳实践:
- 需要频繁更新的场景首选主键表
- 纯追加写入场景可考虑重复键表
- 需要自动聚合的场景选择聚合表
四、与其他特性的兼容性
4.1 索引支持
| 索引类型 | 主键表 | 重复键表 | 聚合表 | 唯一键表 |
|---|---|---|---|---|
| 键列索引 | 全支持 | 全支持 | 全支持 | 全支持 |
| 值列索引 | 支持 | 支持 | 不支持 | 不支持 |
4.2 分区与分桶
- 分区:所有表类型支持表达式分区和列表分区
- 随机分桶:仅重复键表从3.1版本开始支持
4.3 物化视图
- 异步物化视图:全支持
- 同步物化视图:主键表不支持,其他表类型支持
4.4 其他特性
| 特性 | 主键表 | 重复键表 | 聚合表 | 唯一键表 |
|---|---|---|---|---|
| CTAS | 支持 | 支持 | 不支持 | 不支持 |
| 备份恢复 | 2.5+支持 | 全支持 | 全支持 | 全支持 |
五、表类型选型指南
根据业务场景选择最合适的表类型:
-
主键表:
- 需要频繁更新的场景
- 需要完整DELETE能力的场景
- 对查询性能要求极高的场景
-
重复键表:
- 纯追加写入的日志类数据
- 需要保留所有原始记录的场景
- 需要随机分桶的场景
-
聚合表:
- 需要自动预聚合的指标数据
- 需要节省存储空间的场景
- 需要高级聚合函数(HLL/BITMAP等)的场景
-
唯一键表:
- 需要去重保证的场景
- 历史版本兼容考虑
- 相对简单的键值更新场景
通过本文的详细对比分析,相信您已经能够根据自身业务特点,在StarRocks中选择最适合的表类型,充分发挥其高性能分析能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



