首页/数据/数仓建模速查/StarRocks 表模型选择:主键与聚合
湖仓与引擎63 条

StarRocks 表模型选择:主键与聚合

主键模型支持按主键更新并支持部分列更新(适合维表与状态表);聚合模型在写入时聚合,查询按 agg 函数合并,适合指标表。

数仓建模速查数据更新于 2026-10-13

表模型决定写入语义

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 更新(早期形态)新表一般直接用主键模型

怎么选模型

先问数据是否可重复写入:可以重复写入且需要覆盖的,用主键模型;只追加不回头的,用明细模型;写入端已经做过聚合、且查询总是按同一组维度求和的,才考虑聚合模型。维表用聚合模型是最常见的错配,取值会被隐式求和,表面上数据还在,语义已经变了。

主键模型写入时要维护主键索引,宽表高频更新的写入成本明显高于明细模型;更新频率低、列数多的表,评估后可能仍选明细模型加每日整分区重写更划算。
把维表建成聚合模型后,取值变成求和语义,同一个门店的两条记录会被合并成一行数值相加,问题往往在业务核对时才被发现。

易错点

  • 维表用聚合模型,取值变成求和语义,属性数据全部失真
  • 指标表用明细模型且未去重,重复导入导致指标翻倍
  • 主键模型分桶数过少,写入集中在少数分桶成为瓶颈
  • 副本数配置与集群规格不匹配,导入频繁失败或资源浪费

数据来源与参考

  • StarRocks 官方文档:Table Types
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌