维度与事实设计149 条

聚合事实表

对明细事实按高频维度组合预聚合(日×渠道×品类),换取查询性能;需与明细口径一致并声明可上卷范围。

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

聚合事实表是什么

聚合事实表是对明细事实按高频维度组合预先算好的结果表,比如按日 × 渠道 × 品类汇总的销售表。它用空间换性能:报表不必扫描上亿行明细,直接从聚合表取数。代价是多了一条要与明细保持一致的口径链路,因此必须声明可上卷的维度范围,并定期与明细对账,否则两套实现迟早分叉。

基本信息

来源由明细事实表按固定维度组合预聚合得到
常见粒度日 × 渠道 × 品类、月 × 地区 × 商品线
可上卷范围只包含维度的上层属性,明细维度不可用
一致性要求与明细同源同口径,禁止两套独立实现
运维要求有对账作业,偏差超阈值即告警

典型使用场景

  • 高频看板:日报表固定按日渠道品类展示,走聚合表秒级响应
  • 大数据量报表:明细百亿行无法直查,必须预聚合
  • 固定口径指标:指标口径稳定、维度组合固定的场景最适用
  • 成本优化:降低扫描量与计算资源,尤其是按次计费的引擎
  • 历史回算:口径变更后批量重算聚合表,而不是让报表实时算
  • 临时补数:明细不可用时用聚合表兜底(需注明上限)

聚合与对账

聚合与对账
-- 1) 生成聚合表:来源是与明细相同的明细事实
INSERT INTO fact_order_agg_d
SELECT dt, channel, category_id,
       sum(gmv)  AS gmv,
       count(1)  AS order_cnt,
       count(distinct user_id) AS buyer_cnt
FROM   fact_order
WHERE  dt = '2026-10-11'
GROUP  BY dt, channel, category_id;

-- 2) 与明细对账:两边必须相等,差异即为口径漂移
SELECT sum(gmv) FROM fact_order WHERE dt = '2026-10-11'
UNION ALL
SELECT sum(gmv) FROM fact_order_agg_d WHERE dt = '2026-10-11';

聚合取舍对照

维度组合收益风险
日 × 渠道 × 品类高频查询提速明显品类树调整后需重算历史
月 × 地区月报最常用跨月上卷受口径影响
含去重指标(UV)报表口径统一不可再跨维度上卷,需合并算法支持
含比率指标响应快比率不能跨粒度相加,必须按分子分母算
全量维度笛卡尔上卷最灵活行数爆炸,收益被抵消
聚合表与原明细必须两条链路都可用:只建聚合不建明细,任何下钻需求都会变成事故。比率类指标只能存分子与分母并现算,直接存比率再跨维度平均是最常见的错误用法。

易错点

  • 只建聚合表不建明细:一旦需要下钻或换维度组合,整条链路无路可走
  • 聚合逻辑与明细两套独立实现:短期看不出,长期每天对不上账且难以定位
  • 在聚合表上再上卷到未包含的维度:结果看似正确,实际缺维或重复
  • 存比率型指标却做跨粒度平均:口径错误且难以发现
  • 聚合表无对账作业:口径漂移只能靠业务方发现,发现时通常已影响对外披露

数据来源与参考

  • 数仓分层与预聚合实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌