物化视图与预聚合
物化视图把预聚合结果真正存下来,并由引擎在查询时按需改写(透明加速);另一种等价做法是用普通汇总表加调度刷新。适合承接高并发的固定报表查询,代价是数据新鲜度与明细能力:读到的不是最新明细,而是上次刷新时的聚合格。关键设计点是刷新策略(全量刷新还是按分区增量刷新)、刷新与下游读取的时间关系、以及刷新失败时的回退方案。
基本信息
| 常见形式 | Doris、StarRocks、ClickHouse、Trino 的物化视图,或调度生成的汇总表 |
|---|---|
| 刷新方式 | 定时刷新、按分区增量刷新、写入触发刷新(按引擎能力) |
| 收益 | 高并发报表查询显著加速,明细层压力下降 |
| 风险 | 刷新失败或延迟导致展示过期数据 |
| 配套要求 | 刷新任务纳入调度与告警,记录数据时间 |
典型使用场景
- 日报看板:固定维度组合的高并发查询,用物化视图承接
- 跨表聚合复杂、明细扫描成本高,把常用组合预先算好
- 多团队共用同一张宽表,避免各自重复扫描明细
- 降低明细层压力:把大屏与导出类查询都指向汇总表
- 按分区增量刷新:每日只重算当天分区,减少刷新耗时
汇总表方式的刷新
汇总表方式的刷新
-- 用调度每日按分区覆盖刷新,查询侧直接读汇总表
INSERT OVERWRITE TABLE ads_metric_daily_agg PARTITION (dt='2026-10-11')
SELECT category,
channel,
SUM(pay_amt) AS pay_amt, -- 可加度量
COUNT(DISTINCT user_id) AS pay_user_cnt -- 去重度量
FROM dwd_trade_order_detail_di
WHERE dt = '2026-10-11'
GROUP BY category, channel;
-- 查询侧:确认读取的是哪一天的数据
SELECT dt, category, pay_amt FROM ads_metric_daily_agg
WHERE dt = (SELECT MAX(dt) FROM ads_metric_daily_agg);刷新策略对照
| 策略 | 适用 | 优点 | 风险 |
|---|---|---|---|
| 全量刷新 | 数据量小、维度变动频繁 | 实现简单 | 刷新耗时长,峰值资源高 |
| 按分区增量 | 按日期分区的汇总 | 耗时短、资源可控 | 历史分区修改需单独回刷 |
| 写入触发 | 实时性要求高 | 数据新鲜 | 并发写入成本上升 |
| 定时批刷新 | T+1 报表 | 与调度链路一致 | 需处理延迟与失败 |
汇总表刷新失败必须告警,并阻止下游读取过期分区;否则看板会安静地展示旧数据,比直接报错更难被发现。
去重类度量在汇总表里要谨慎:COUNT DISTINCT 结果不能跨分区或跨维度相加,跨天累加需要保留明细或改用位图类结构(按所使用引擎能力选择)。
维度组合增加后物化视图数量容易失控:只对高频组合建,其余走明细引擎,并定期清理长期无人查询的物化视图。