表模型决定写入语义
StarRocks 的表模型不只是存储结构,它直接定义了同主键多次写入会发生什么:追加不去重、按 key 聚合、按 key 覆盖。选错模型的表现往往很隐蔽——维表用了聚合模型,取值变成求和;指标表用了明细模型,重复导入就重复计数。建表时想清楚数据是「只追加」还是「需要最新态」。
基本信息
| 明细模型 | 追加不去重,适合日志与不可变明细 |
|---|---|
| 聚合模型 | 写入时按 key 聚合,查询按聚合函数合并 |
| 主键模型 | 按主键覆盖,支持部分列更新 |
| 分桶方式 | DISTRIBUTED BY HASH(列) BUCKETS n |
| 副本数 | PROPERTIES 中的 replication_num |
典型使用场景
- 维表:主键模型按主键覆盖,永远保留最新属性
- 指标汇总:聚合模型写入即聚合,查询时合并结果
- 行为日志:明细模型追加,保留每条原始记录
- 状态表:主键模型配合部分列更新,只更新变化的列
- 宽表指标:主键模型承载需要频繁更新的结果表
主键模型示例
主键模型示例
CREATE TABLE dw.dim_store (
store_id VARCHAR(32) NOT NULL,
store_name VARCHAR(128),
region_id VARCHAR(32),
update_time DATETIME
)
PRIMARY KEY (store_id)
DISTRIBUTED BY HASH(store_id) BUCKETS 8
PROPERTIES (
'replication_num' = '3' -- 副本数按集群规格调整
);
-- 同一 store_id 再次导入会覆盖旧行,不会产生重复表模型对照
| 模型 | 写入语义 | 典型用途 |
|---|---|---|
| 明细模型 | 追加,不去重 | 日志与不可变明细 |
| 聚合模型 | 按 key 聚合 | 指标汇总表 |
| 主键模型 | 按 key 覆盖,可部分列更新 | 维表与状态表 |
| 更新模型 | 按 key 更新(早期形态) | 新表一般直接用主键模型 |
怎么选模型
先问数据是否可重复写入:可以重复写入且需要覆盖的,用主键模型;只追加不回头的,用明细模型;写入端已经做过聚合、且查询总是按同一组维度求和的,才考虑聚合模型。维表用聚合模型是最常见的错配,取值会被隐式求和,表面上数据还在,语义已经变了。
主键模型写入时要维护主键索引,宽表高频更新的写入成本明显高于明细模型;更新频率低、列数多的表,评估后可能仍选明细模型加每日整分区重写更划算。
把维表建成聚合模型后,取值变成求和语义,同一个门店的两条记录会被合并成一行数值相加,问题往往在业务核对时才被发现。