物化视图概览
物化视图(Materialized View)是既包含计算逻辑、也包含数据的实体;与仅存储计算逻辑、不存储数据的普通视图不同,物化视图会按策略周期或实时刷新数据,可直接被查询,也可对查询进行透明改写。
阅读须知
在选择和使用物化视图前,建议先确认以下问题:
- 想解决什么问题?查询加速、数据建模,还是湖仓加速?
- 对数据时效性要求多高?需要强一致还是最终一致?
- 定义 SQL 涉及单表还是多表?
- 刷新方式希望是全量、分区增量,还是实时?
下文将围绕这些问题逐一展开。
物化视图的使用场景
物化视图根据 SQL 定义计算并存储数据,并按策略进行周期性或实时性更新。它可被直接查询,也可以将查询透明改写。常见适用场景如下:
查询加速
在决策支持系统(如 BI 报表、Ad-Hoc 查询)中,分析型查询通常包含聚合操作,可能还涉及多表连接。
- 计算此类查询结果较为消耗资源,响应时间可能长达分钟级。
- 业务场景往往要求秒级响应。
- 可通过构建物化视图,对常见查询进行加速。
轻量化 ETL(数据建模)
在数据分层场景中,可以使用物化视图的嵌套来构建 DWD 和 DWM 层,并利用物化视图的调度刷新能力替代部分 ETL 任务。
湖仓一体
针对多种外部数据源,可对其使用的表构建物化视图,从而:
- 节省从外部表导入数据到内部表的成本;
- 加速对外部数据源的查询过程。
物化视图的分类
可以从数据时效性、SQL 模式、刷新方式三个维度对物化视图进行分类。
按数据时效性分类:同步 vs 异步
| 分类 | 数据一致性 | 典型时效 | 是否支持直接查询 | 适用场景 |
|---|---|---|---|---|
| 同步物化视图 | 与基表强一致 | 实时 | 不支持 | 时效性要求高的场景 |
| 异步物化视图 | 与基表最终一致 | T+1 / 小时级 | 支持 | 时效性要求不高的常规分析场景 |
选型建议:
- 时效性要求高 → 选择同步物化视图。
- 时效性要求不高,可接受一定延迟 → 选择异步物化视图。
按支持透明改写的 SQL 模式分类:单表 vs 多表
物化视图的定义 SQL 既可以是单表查询,也可以是多表查询。从所用表数量出发,可分为单表物化视图和多表物化视图:
- 异步物化视图:可使用单表,也可使用多表。
- 同步物化视图:仅支持单表。
按刷新方式分类:全量 vs 分区增量 vs 实时
不同类别的物化视图支持的刷新方式不同:
| 物化视图类型 | 全量刷新 | 分区增量刷新 | 实时刷新 |
|---|---|---|---|
| 异步物化视图 | 支持 | 支持 | 不支持 |
| 同步物化视图 | - | - | 支持 |
各刷新方式的含义:
- 全量刷新(异步):计算物化视图定义 SQL 的所有数据。
- 分区增量刷新(异步):当物化视图基表的分区数据发生变化时,识别出对应变化的分区并仅刷新这些分区,无需刷新整个物化视图。
- 实时刷新(同步):可以理解为实时刷新,始终保持与基表的数据一致。