预聚合的边界
预聚合把高频查询用到的维度组合提前算好,例如月 × 区域 × 类目,查询时直接扫汇总表而不再扫明细。设计要点三条:粒度不能比明细更细,否则组合数爆炸、聚合表反而更大;要明确标注「到此粒度不可再下钻」;预聚合结果与明细必须能勾稽。顺序上永远是先有明细事实表,再由它派生预聚合,反过来做会让汇总数字失去可追溯的来源。
基本信息
| 粒度 | 仅覆盖常用维度组合,不再下钻 |
|---|---|
| 组合数 | 受控,原则上不超过明细粒度 |
| 勾稽 | 与明细合计按周期比对 |
| 刷新 | 随明细任务串联重算或增量滚动 |
| 归属 | 派生层,不承载新口径 |
典型使用场景
- 固定报表每天跑月 × 区域 × 类目,预聚合后扫描量显著下降
- 自助分析反复扫明细造成集群压力,用预聚合承接高频组合
- 明细表很大但常用组合有限,少量预聚合覆盖多数查询
- 口径调整后通过勾稽任务确认预聚合与明细仍然一致
- 发布给下游前检查汇总表是否已声明不可再下钻
派生与勾稽
派生与勾稽
-- 由明细派生预聚合,表名标注派生层
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;设计项对照
| 设计项 | 要求 | 不满足的后果 |
|---|---|---|
| 粒度 | 粗于或等于明细粒度 | 组合数超明细,查询反而更慢 |
| 下钻声明 | 标注不可再下钻 | 用户下钻时数字对不上 |
| 勾稽 | 与明细按周期比对 | 修复明细后汇总长期偏差 |
| 刷新 | 与明细任务串联 | 明细更新后汇总滞后一个周期 |
预聚合的价值是加速与口径统一,不创造新指标;任何只存在于汇总层的计算逻辑,都要回到明细层再实现一次。
组合爆炸是常见问题:三个维度各十个取值就有一千行,再叠时间维度增长更快,所以只保留被查询频次真正支撑的组合,并定期清理长期无人使用的表。