同步物化视图透明改写
同步物化视图(Sync-Materialized View)是一种预计算表,按预定义的 SELECT 语句存储计算结果。它既支持原始明细数据的任意维度分析,又能加速固定维度的聚合查询。
查询时,Doris 会自动匹配最优物化视图并直接读取,全程对用户透明,称为「透明改写」。基础表(Base Table)数据变更时,物化视图由 Doris 自动维护一致性,无需人工介入。
阅读须知
- 已部署 Doris 2.0 或更高版本
- 已存在一张明细基础表,并存在重复出现的固定聚合查询
- 拥有创建物化视图所需的库表权限
- 已具备测试环境,可在投产前验证命中效果
适用场景
| 场景类型 | 典型特征 |
|---|---|
| 明细 + 固定维度并存 | 既要查明细,也要查固定聚合 |
| 列/行裁剪 | 查询仅涉及表中少部分列或行 |
| 高耗时算子 | 包含长时间聚合等重操作 |
| 不同前缀索引 | 需要匹配不同的前缀索引以加速过滤 |
一句话定义:同步物化视图 = 自动维护一致性的预聚合表 + 自动匹配最优视图的透明改写。
- Doris 2.0 及后续版本对物化视图做了功能增强;正式投产前,请先在测试环境验证目标查询能否命中预期物化视图。
- 不建议在同一张表上创建多个形态相似的物化视图,否则可能因互相冲突导致命中失败。
案例:按门店统计销售额
假设存在销售明细表 sales_records,记录每笔交易的交易 ID、销售员 ID、售卖门店 ID、销售日期与交易金额。常见分析需求是按门店聚合销售量。
下文将创建一个按 store_id 分组求和的物化视图 store_amt,并验证查询是否被透明改写到该视图。
步骤 1:创建同步物化视图
-
目的:为按门店聚合的查询预计算结果。
-
命令:
CREATE MATERIALIZED VIEW store_amt AS
SELECT store_id, SUM(sale_amt)
FROM sales_records
GROUP BY store_id; -
说明:提交后 Doris 在后台异步构建物化视图,不阻塞业务查询。
步骤 2:查看构建进度
-
目的:确认物化视图是否构建完成。
-
命令:
SHOW ALTER TABLE MATERIALIZED VIEW FROM db_name; -
说明:当
State字段变为FINISHED时,表示store_amt已成功创建,可被查询命中。
步骤 3:触发透明改写
-
目的:让符合聚合形态的查询自动走物化视图。
-
命令:
SELECT store_id, SUM(sale_amt) FROM sales_records GROUP BY store_id; -
说明:Doris 自动匹配
store_amt,直接读取预聚合数据,无需修改 SQL。
步骤 4:验证是否命中物化视图
-
目的:确认透明改写已生效。
-
命令:
EXPLAIN SELECT store_id, SUM(sale_amt) FROM sales_records GROUP BY store_id; -
说明:查看执行计划末尾,若出现下列内容,说明已命中
store_amt:TABLE: default_cluster:test.sales_records(store_amt), PREAGGREGATION: ON
透明改写 vs 直接查询基础表
| 对比维度 | 直接查询基础表 | 透明改写到同步物化视图 |
|---|---|---|
| 数据来源 | 明细数据现场计算 | 预聚合结果直接读取 |
| 聚合查询性能 | 受数据量影响大 | 显著提升 |
| SQL 改造成本 | 无 | 无(自动匹配) |
| 数据一致性 | 天然一致 | Doris 自动维护 |
| 维护成本 | 无 | 需规划视图形态,避免冲突 |
常见问题
查询为什么没有命中物化视图?
常见原因:
- 物化视图仍在构建中,
State尚未变为FINISHED。 - 查询的列、聚合函数或分组键与物化视图定义不匹配。
- 同一基础表上存在多个形态相似的物化视图,触发冲突导致改写失败。
排查方法:使用 EXPLAIN 查看执行计划末尾的 TABLE: ...(物化视图名) 信息,确认实际命中的表。
如何查看物化视图构建状态?
执行 SHOW ALTER TABLE MATERIALIZED VIEW FROM db_name;,关注 State 字段:
PENDING/RUNNING:构建中。FINISHED:构建完成,可被命中。CANCELLED:构建失败或已取消,需排查后重新创建。
一张基础表能否创建多个物化视图?
可以,但不建议形态相似。多个相似视图会导致透明改写时无法选定最优视图,反而引发命中失败。建议先在测试环境验证查询能否命中预期视图。
物化视图的数据需要手动同步吗?
不需要。基础表数据变更时,Doris 自动维护物化视图的一致性。
总结
- 同步物化视图 = 预聚合表 + 自动一致性维护 + 透明改写。
- 适合明细查询与固定维度聚合并存的场景。
- 创建后用
EXPLAIN验证命中,避免相似视图冲突。 - 投产前在测试环境验证目标查询的命中情况。