首批通过分布式安全可靠测评,为关键业务系统打造
物化视图概述
更新时间:2026-02-16 13:31:31
物化视图是一种特殊的视图,它存储查询结果的副本,并定期刷新(也可以手动刷新)以保持数据的最新状态。与普通视图(虚拟表,每次访问都要重新计算)不同,物化视图包含了数据的物理副本,因此可以直接从物化视图中查询数据而无需执行复杂的 SQL 查询语句,从而大幅提升查询性能,即通过空间换时间来加速查询。
功能特性
物化视图类型
非实时物化视图
非实时物化视图,顾名思义物化视图中存储的结果集并不是最新的,它并不会在每次更新基表时立即更新物化视图,而是按照某种预定的时间或者手动触发进行刷新,并且查询物化视图时只会查询实际物理存储的数据。这种方式适用于那些对数据新鲜度要求不高,但是对查询性能有较高需求的场景。
实时物化视图
实时物化视图是一种支持获取实时数据的数据库对象,它通过使用 mlog 的机制来捕获和处理底层基表的更改,确保物化视图中的数据能及时反映最新状态。在执行查询时,实时物化视图会通过在线计算,即时集成这些更改,以向用户展示更新后的数据。这样,即便物化视图没有物理地存储最新的数据,用户仍可以得到实时更新的查询结果。
物化视图刷新策略
OceanBase 数据库物化视图支持全量刷新、增量刷新(快速刷新)、混合刷新和永不刷新四种刷新策略。具体如下:
全量刷新
全量刷新是一种较为直接的方式,每次执行刷新操作时,系统会重新执行物化视图对应的查询语句,完整地计算并覆盖原有的视图结果数据,这种方式适用于数据量相对较小的场景。
增量刷新
增量刷新仅需处理自上次刷新以来发生变更的部分。为了实现精确的增量刷新,OceanBase 实现了类似 Oracle MLOG(Materialized View Log)的物化视图日志功能,通过日志详细跟踪记录基础表的增量更新数据,从而确保物化视图能够进行快速增量刷新。增量刷新方式尤其适用于数据量庞大且变更频繁的业务场景。
混合刷新
首先尝试增量刷新,如果增量刷新失败,则执行全量刷新。
永不刷新
物化视图只在创建时进行刷新,并在创建后不允许再次刷新。
物化视图刷新方式
OceanBase 数据库物化视图刷新方式包括自动刷新与手动刷新。
自动刷新
在创建物化视图时,支持配置刷新的时机,配置自动刷新的时间间隔。可以通过指定
START WITH datetime_expr和NEXT datetime_expr子句来为物化视图设置后台自动刷新调度时机。手动刷新
如果物化视图未配置自动刷新或自动刷新的间隔比较大时,可以使用
DBMS_MVIEW.REFRESH包进行手动刷新,让物化视图的数据与基表数据保持同步状态。
物化视图加速查询
物化视图可以包含聚合,连接和子查询等操作,并且可以被索引和分区,以进一步提高性能。
查询改写
在创建物化视图时可以通过指定
ENABLE QUERY REWRITE来使用物化视图的自动改写能力,此时系统可以将对原始表的查询改写为针对物化视图的查询,以此减少业务改造量。使用索引
可以根据自身业务的需求来决定在某些字段创建索引,从而加快在这些字段的查询速度。
选择数据存储格式
OceanBase 数据库支持行存储格式和列存储格式的物化视图,在一些部分包含物化视图引用的复杂分析场景获得更好的查询性能。
使用主键
支持用户为物化视图指定主键,以此优化基于主键的单行查找、范围查询或关联场景性能。
使用分区
在创建物化视图时,可以设置表选项,并根据数据特征和访问模式来设计和配置适合的分区选项,以提高查询性能和管理效率。
应用场景
物化视图被用来优化查询性能,尤其是在处理大量数据和复杂查询时。它通过预计算和存储视图的查询结果,减少实时计算来提升查询性能,简化复杂查询逻辑,常用于快速报表生成和数据分析场景。
- 频繁查询相同数据:物化视图适合存储经常需要被重复计算且比较消耗资源的复杂查询,避免每次查询时重复计算,提高查询效率。
- 数据预汇总:汇总每天、每周或每月的销售数据、统计用户行为数据等,比如报表生成、数据分析等场景可以利用物化视图预计算和存储汇总数据,减少实时计算的时间。
- 大数据量的分析:对于数据量大的业务来说,查询通常会比较耗时,利用物化视图来避免对原始数据的大量扫描。
- 实时分析:对于实时性要求高的业务,可以利用实时物化视图来加速查询,满足业务实时要求。
- 多维数据分析:利用物化视图预先计算各种维度组合下的聚合数据,提供快速的多维查询响应。
注意事项
- 存储开销:物化视图会占用额外的存储空间,需要考虑磁盘容量。
- 刷新(维护)成本:自动或手动刷新物化视图会消耗系统资源,如果基础表数据变化频繁,刷新操作可能会影响系统性能。
- 数据一致性和实时性:物化视图中的数据可能不是实时的,即数据不会随着原始数据的更新而自动更新。如果基础表数据发生变化,视图中的数据可能会过时,需要定期刷新以保持数据一致性。
- 设计复杂性:物化视图的设计和创建需要仔细考虑预期的查询模式和数据访问模式,以便实现最佳的性能优化。
物化视图的基表
在数据库中,物化视图的基表指的是创建该物化视图时所引用的原始表或视图。
| 类型 | 是否可以作为基表 |
|---|---|
| 普通表 | 是 |
| 物化视图 | 是 |
| 普通视图 | 否 |
| 同义词 | 否 |
| 外表 | 是 |
使用限制
不允许对物化视图进行添加数据(Insert)、删除数据(Delete)或修改物化视图定义(Alter)操作。
对物化视图的基表执行 DDL 操作,可能会导致物化视图无法用预期的模式刷新。
- 对于全量刷新,物化视图和基表对应列类型匹配,就可以刷新
- 对于增量刷新,需要在基表上创建物化视图日志,这类基表的一些 DDL 操作会被拦截,一般不删除物化视图日志,就仍然可以增量刷新。
物化视图不支持 XML 类型。
物化视图不支持表级恢复。
单独删除物化视图的时候,物化视图不进回收站。
drop database的时候会随database进回收站。为物化视图指定主键后,维护/更新物化视图数据时,如果数据不满足主键约束,将导致视图维护失败。例如
CREATE MATERIALIZED VIEW mv1(PRIMARY KEY(c1)) AS SELECT c1 FROM t1;创建物化视图mv1时,t1中c1列存在null值,则创建维护物化视图数据时会触发报错。
操作权限
- 创建物化视图需要有
CREATE TABLE权限。 - 删除物化视图需要有
DROP TABLE的权限。 - 全量刷新需要有所有基表的
SELECT权限。 - 增量刷新需要有所有基表的
SELECT权限以及对应物化视图日志的SELECT权限。 - 物化视图只能赋予
SELECT权限,其他的 DML 操作不支持。