物化视图把查询结果预先计算并存储下来,后续查询直接读取已存储的结果,无需每次重新执行原始查询。PolarDB PostgreSQL版提供普通物化视图、增量物化视图(DIMV)、分区物化视图、增量分区物化视图和实时物化视图五种类型,您可以综合刷新代价、数据新鲜度、对查询定义与基表的限制以及对基表写入的影响选择合适的类型。
概述
物化视图把一条查询的结果预先计算并存储下来,之后的查询直接读取存储好的结果,而不必每次重新执行原始查询。对于聚合、多表连接等代价高昂的分析型查询,这是把秒级、分钟级的查询压缩到毫秒级最直接的手段。
代价是物化视图中的数据不会随基表自动变化,需要通过刷新来追上基表。PolarDB PostgreSQL版提供的几种物化视图,本质上是在刷新代价、数据新鲜度、对查询定义与基表的限制、对基表写入的影响这几个维度之间做不同的取舍。
物化视图体系
PolarDB PostgreSQL版的物化视图体系提供全量、分区、增量三类物化视图和与之配套的多级刷新策略,覆盖从秒级准实时到T+1的全谱系时效需求:
增量刷新:只计算基表的变更量,不重算未变化的数据。变更通过物化视图日志(Materialized View Log,简称mlog)记录,对基表写入的额外开销与多维护一个索引相当(通常低于5%),秒级刷新即可支撑准实时报表。按变更应用的时机,又分为在语句结束时同步维护的实时物化视图,和先记入mlog、在刷新时异步应用的增量物化视图(DIMV)。
分区刷新:分区物化视图基于分区基表自动识别发生变化的分区,只刷新这些分区,并支持按时间维度逐级上卷(如日分区上卷为月)。单次刷新的耗时不随历史数据累积而增长,相比全量重算可节省90%以上的计算资源;每个分区的刷新同样可以交给列存引擎执行(
use_imci)。与DIMV组合成的增量分区物化视图进一步把分区内的刷新也变成增量,并可冻结长期不变的历史分区。全量刷新:普通物化视图对查询定义没有任何限制。刷新时的定义查询可以交给列存索引(IMCI)执行,典型分析型查询的刷新速度可提升30~100倍;同时支持刷新期间不阻塞读。
此外,任何一种物化视图上都可以再创建行存或列存二级索引,把复杂的分析查询固化为TP级的高并发点查。
物化视图类型一览
下表从刷新方式、数据新鲜度、对查询定义的限制、对基表的要求与写入影响和创建方式五个维度对比五种物化视图:
类型 | 刷新方式 | 数据新鲜度 | 对查询定义的限制 | 对基表的要求与写入影响 | 创建方式 |
手动或定时全量重算 | 取决于刷新频率 | 无,任何查询都可以物化 | 无要求,写入无影响 |
| |
增量物化视图(DIMV) | mlog记录变更,按需或由后台worker异步增量刷新 | 秒级,取决于刷新间隔 | 支持子查询、窗口函数、任意聚合、部分外连接,可嵌套 | 基表需有主键(或 |
|
版本追踪,仅全量重算发生变化的分区 | 取决于刷新频率 | 分区键须在 | 基表须为单列 |
| |
分区裁剪+分区内异步增量刷新,历史分区可冻结 | 秒级,取决于刷新间隔 | 同时满足分区物化视图与DIMV的限制 | 同时满足分区物化视图与DIMV对基表的要求;写入开销同DIMV |
| |
基表 | 始终与基表一致 | 与增量物化视图相同,但不支持嵌套 | 对基表写入性能有较大影响,适合读多写少的场景 |
|
额外说明:
命名:实时物化视图与增量物化视图都采用增量维护,对查询定义的限制也相同,区别在于变更应用的时机。实时物化视图在写入语句结束时同步更新(
ON COMMIT);增量物化视图把变更先记入mlog,在刷新时异步应用(ON DEMAND)。前者换来与基表严格一致,后者换来对写入路径更小的影响。此外,实时物化视图不支持嵌套,因此DIMV中依赖自动嵌套才能支持的查询形式在实时物化视图上不可用。扩展依赖:除普通物化视图外,其余四种类型都需要
polar_ivm扩展;增量物化视图与增量分区物化视图目前仅在PostgreSQL 14上提供。版本要求:各类型物化视图的内核小版本要求,以对应文档“适用范围”章节标注的版本标签为准。