如何通过物化视图优化Oracle数据库视图查询速度?
- 内容介绍
- 文章标签
- 相关推荐
本文共计797个文字,预计阅读时间需要4分钟。
相关专题:
oracle普通视图本身不存储数据,只是封装了查询逻辑,每次调用都会实时执行底层sql——如果原表大、连接多、计算重,性能自然差。解决方向很明确:把“每次都算”变成“提前算好、定期更新”,物化视图(materialized view)就是为此而生的。
物化视图不是普通视图,得显式创建和刷新
普通视图是虚拟的,CREATE VIEW 后直接可用;物化视图是物理对象,必须用 CREATE MATERIALIZED VIEW 显式定义,并且默认不会自动刷新数据。
- 创建时需指定
REFRESH方式:ON COMMIT(事务提交时刷新,适合小数据+强一致性)、ON DEMAND(手动或定时调用DBMS_MVIEW.REFRESH,更常用) - 若底层表没主键或没启用
ROWID,可能无法支持快速刷新(FAST),只能用完全刷新(COMPLETE),耗时更长 - 首次创建会触发一次完全刷新,注意避开业务高峰
物化视图能走索引,但得自己建
物化视图底层实际是一张物理表(MV$ 开头的对象),但它不会自动继承原表索引,也不会自动生成索引。查询慢,很可能是因为没在物化视图上建索引。
本文共计797个文字,预计阅读时间需要4分钟。
相关专题:
oracle普通视图本身不存储数据,只是封装了查询逻辑,每次调用都会实时执行底层sql——如果原表大、连接多、计算重,性能自然差。解决方向很明确:把“每次都算”变成“提前算好、定期更新”,物化视图(materialized view)就是为此而生的。
物化视图不是普通视图,得显式创建和刷新
普通视图是虚拟的,CREATE VIEW 后直接可用;物化视图是物理对象,必须用 CREATE MATERIALIZED VIEW 显式定义,并且默认不会自动刷新数据。
- 创建时需指定
REFRESH方式:ON COMMIT(事务提交时刷新,适合小数据+强一致性)、ON DEMAND(手动或定时调用DBMS_MVIEW.REFRESH,更常用) - 若底层表没主键或没启用
ROWID,可能无法支持快速刷新(FAST),只能用完全刷新(COMPLETE),耗时更长 - 首次创建会触发一次完全刷新,注意避开业务高峰
物化视图能走索引,但得自己建
物化视图底层实际是一张物理表(MV$ 开头的对象),但它不会自动继承原表索引,也不会自动生成索引。查询慢,很可能是因为没在物化视图上建索引。

