首页/数据/数仓建模速查/预聚合事实表设计
维度与事实设计149 条

预聚合事实表设计

把高频查询的维度组合预先聚合(如月 x 区域 x 类目),控制组合数并标明「不可再下钻」;预聚合与明细必须能勾稽。

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

预聚合的边界

预聚合把高频查询用到的维度组合提前算好,例如月 × 区域 × 类目,查询时直接扫汇总表而不再扫明细。设计要点三条:粒度不能比明细更细,否则组合数爆炸、聚合表反而更大;要明确标注「到此粒度不可再下钻」;预聚合结果与明细必须能勾稽。顺序上永远是先有明细事实表,再由它派生预聚合,反过来做会让汇总数字失去可追溯的来源。

基本信息

粒度仅覆盖常用维度组合,不再下钻
组合数受控,原则上不超过明细粒度
勾稽与明细合计按周期比对
刷新随明细任务串联重算或增量滚动
归属派生层,不承载新口径

典型使用场景

  • 固定报表每天跑月 × 区域 × 类目,预聚合后扫描量显著下降
  • 自助分析反复扫明细造成集群压力,用预聚合承接高频组合
  • 明细表很大但常用组合有限,少量预聚合覆盖多数查询
  • 口径调整后通过勾稽任务确认预聚合与明细仍然一致
  • 发布给下游前检查汇总表是否已声明不可再下钻

派生与勾稽

派生与勾稽
-- 由明细派生预聚合,表名标注派生层
CREATE TABLE ads_sales_month_region AS
SELECT substr(dt, 1, 7) AS month,
       region_sk,
       sum(amt) AS amt,
       sum(qty) AS qty,
       count(DISTINCT order_id) AS order_cnt
FROM dwd_sales
GROUP BY substr(dt, 1, 7), region_sk;

-- 勾稽:预聚合合计必须等于同期明细合计
SELECT (SELECT sum(amt) FROM dwd_sales WHERE dt LIKE '2026-09%') AS detail_amt,
       (SELECT sum(amt) FROM ads_sales_month_region WHERE month = '2026-09') AS agg_amt;

设计项对照

设计项要求不满足的后果
粒度粗于或等于明细粒度组合数超明细,查询反而更慢
下钻声明标注不可再下钻用户下钻时数字对不上
勾稽与明细按周期比对修复明细后汇总长期偏差
刷新与明细任务串联明细更新后汇总滞后一个周期
预聚合的价值是加速与口径统一,不创造新指标;任何只存在于汇总层的计算逻辑,都要回到明细层再实现一次。
组合爆炸是常见问题:三个维度各十个取值就有一千行,再叠时间维度增长更快,所以只保留被查询频次真正支撑的组合,并定期清理长期无人使用的表。

易错点

  • 维度组合数超过明细粒度,聚合表比明细还大
  • 明细修正后预聚合未重算,两层长期对不上
  • 把预聚合表当独立数据源做新口径,形成无法追溯的孤儿数字
  • 只建不删,历史预聚合表越积越多,元数据与调度成本上升

数据来源与参考

  • 数仓实践:预聚合设计
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌