三种表模型是什么
Apache Doris 建表时要先选表模型,它决定同一 Key 的多行数据怎么处理。明细模型 Duplicate 不去重不聚合,写入多少行就存多少行;聚合模型 Aggregate 在建表时给指标列指定聚合函数(SUM、MAX、REPLACE 等),导入时按 Key 直接聚合;主键模型 Unique 对同 Key 的写入做覆盖,只保留最新一行。Key 列必须写在建表列的最前面,Doris 依据 Key 前缀生成索引,所以 Key 的顺序同时影响查询过滤效率。
基本信息
| 适用平台 | Apache Doris 1.x/2.x(StarRocks 有同名模型,参数写法不同) |
|---|---|
| 三种模型 | Duplicate 明细 / Aggregate 聚合 / Unique 主键 |
| Key 列约束 | 必须位于建表列最前,并参与前缀索引 |
| 常用聚合函数 | SUM、MAX、MIN、REPLACE、REPLACE_IF_NOT_NULL、BITMAP_UNION、HLL_UNION |
| 更新能力 | Unique 支持按主键更新与删除;Aggregate 与 Duplicate 不支持整行更新 |
| 分桶配合 | DISTRIBUTED BY HASH(Key 列) BUCKETS n |
典型使用场景
- 埋点、日志、行为流水需要保留每一行原始记录,用 Duplicate,查询可回溯到单条事件
- 看板指标只按固定维度做求和,用 Aggregate 把聚合提前到导入阶段,查询更快且表更小
- 维表、状态表需要按主键覆盖写,用 Unique,避免下游读到同一实体的多个历史版本
- 需要精确去重计数(如日活用户数)时用 BITMAP_UNION,比在明细上 count distinct 更省资源
- 同一份数据既要明细又要聚合,明细存 Duplicate,再用物化视图或另一张 Aggregate 表提供汇总
三种模型建表
三种模型建表
CREATE TABLE dw.dim_store ( -- 主键模型:同 key 覆盖
store_id VARCHAR(32) NOT NULL,
store_name VARCHAR(128),
update_time DATETIME
)
UNIQUE KEY(store_id)
DISTRIBUTED BY HASH(store_id) BUCKETS 8;
CREATE TABLE dw.dws_trade_store_day ( -- 聚合模型:导入即聚合
dt DATE NOT NULL,
store_id VARCHAR(32) NOT NULL,
order_cnt BIGINT SUM DEFAULT '0',
pay_amt DECIMAL(18,2) SUM DEFAULT '0'
)
AGGREGATE KEY(dt, store_id)
DISTRIBUTED BY HASH(store_id) BUCKETS 16;
CREATE TABLE dw.dwd_trade_order_dup ( -- 明细模型:不去重
order_id VARCHAR(32) NOT NULL,
pay_amt DECIMAL(18,2),
dt DATE NOT NULL
)
DUPLICATE KEY(order_id, dt)
DISTRIBUTED BY HASH(order_id) BUCKETS 16;模型逐项对照
| 模型 | 同 Key 行为 | 数据保留 | 典型场景 |
|---|---|---|---|
| Duplicate 明细 | Key 仅用于索引与排序 | 全部行原样保留 | 日志、埋点、明细查询 |
| Aggregate 聚合 | 按聚合函数合并 | 同 Key 汇成一行 | 固定维度的 SUM/MAX 指标表 |
| Unique 主键 | 同 Key 覆盖为最新 | 同 Key 一行 | 维表、状态表、需要更新的实体表 |
Aggregate 的聚合在导入阶段完成,历史数据无法再还原成明细;比率类指标必须存分子与分母,查询时相除,直接存比率结果会在跨维度汇总时算错。
Unique 模型早期实现是读时合并,查询要额外付出合并开销;1.2 引入 Merge-on-Write 后写入阶段即完成合并,读性能接近明细表,具体是否默认启用随版本与配置而变。