首页/数据/数仓建模速查/Doris 物化视图与查询改写
湖仓与引擎63 条

Doris 物化视图与查询改写

Doris 物化视图在导入时增量刷新,查询命中后自动改写;适合固定维度的聚合加速,需要观察命中率与刷新延迟。

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

物化视图加速的是什么

固定维度的聚合查询每次都去扫明细,代价高且重复。物化视图把聚合结果预先算好并随导入增量刷新,查询命中后由优化器自动改写为读视图。它加速的是「重复出现的同一类聚合」,不是所有查询;建得越多,导入链路的维护成本越高。

基本信息

刷新方式导入触发或定时刷新
查询改写命中后自动匹配,无需改 SQL
适用形态固定维度的聚合,如按门店按天汇总
观测指标命中率与刷新延迟
代价每个视图都要随导入维护,拖慢导入

典型使用场景

  • 看板固定聚合:门店按天、类目按天的汇总反复被查询
  • 明细表很宽:把常用几列聚合出来,扫描量大幅下降
  • 高并发点查:聚合结果体量小,支撑并发能力更强
  • 多下游复用:一个视图同时服务报表与接口
  • 降本:用预聚合结果替代对明细的反复全表扫描

创建与查看

创建与查看
-- 同步物化视图:按门店与日期预聚合
CREATE MATERIALIZED VIEW mv_store_day
AS
SELECT store_id, date(create_time) AS dt, sum(pay_amt) AS pay_amt
FROM dw.dwd_trade_order
GROUP BY store_id, date(create_time);

SHOW MATERIALIZED VIEWS FROM dw;   -- 查看视图清单与状态
-- 查询原表时由优化器判断是否改写为读视图

视图类型与能力

类型刷新方式适用判断
同步物化视图随导入同步维护单表聚合,维度固定
异步物化视图按需构建与刷新多表关联与复杂聚合
普通视图不存数据只做逻辑封装
预聚合表(手写)由调度任务产出逻辑复杂、需要精细控制

命中率才是收益指标

建完视图不等于查询就会变快:只有写法和维度能对上,优化器才会改写。上线后应当观察视图的命中次数与刷新延迟,长期没人命中的视图要考虑下线。判断依据是实际查询日志,而不是当初的设想。

异步物化视图的构建与刷新配置随版本演进较多,语句细节以所用版本的官方文档为准;建之前先确认版本支持的语法,再定刷新策略。
物化视图数量失控会明显拖慢导入链路:每次导入都要同步维护所有相关视图,导入耗时翻倍,而多数视图其实并没有被查询命中。

易错点

  • 物化视图建了一堆却没有命中率观测,导入耗时翻倍且无法判断该删哪些
  • 把明细查询当成聚合查询来建视图,维度对不上,优化器根本不会改写
  • 视图刷新延迟超过业务可接受范围,看板拿到过期数据且无从察觉
  • 把物化视图当作唯一加速手段,忽略分区裁剪与排序键这类更基础的手段

数据来源与参考

  • Apache Doris 官方文档:Materialized View
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌