Oracle物化视图优化多表查询速度详解

 更新时间:2026年07月11日 09:58:38   作者:小狗的面具_  
想让数据库报表秒开?别被慢查询拖累,本文用实战教你用Oracle物化视图优化多表关联SQL,大幅提升查询速度,手把手讲解创建、刷新与监控,直接解决大数据量下的性能瓶颈

近期项目中遇到有关报表查询sql速度过慢的问题,由于sql是多个表相关联的查询结果,并且数据量过大,所以导致查询速度过慢。为此,采用物化视图来提高查询速度。

1、物化视图概述

物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。

物化视图,说白了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。

(1) 创建方式:Build Immediate 和Build Deferred两种。Build Immediate 是在创建物化视图的时候就生成数据,而Build Deferred则在创建时不生成数据,以后根据需要再生成数据。默认为Build Immediate 。

(2)查询重写:Enable Query Rewrite和Disable Query Rewrite两种。

分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为Disable Query Rewrite。

(3)刷新:指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。

刷新的模式有两种:On Demand和On Commit。

  • On Demand指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。
  • On Commit指物化视图在对基表的DML操作提交的同时进行刷新。

刷新的方法有四种:Fast 、Complete 、Force和Never。

  • Fast 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
  • Complete 刷新对整个物化视图进行完全的刷新。
  • 如果选择Force方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用Complete 的方式。
  • Never指物化视图不进行任何刷新。默认值是Force On Demand。

Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle通过一个物化视图日志还可以支持多个物化视图的快速刷新。

由于本次项目需要,决定采用Complete刷新方式,所以就没有使用物化视图日志功能。

大概了解了物化视图是什么以后,我们就开始通过使用物化视图来实现提高查询速度的功能啦~

2、功能实现

(1) 创建物化视图

采用demand刷新模式,Complete刷新方法,创建视图时刷新数据,后每天凌晨一点全表刷新数据。

CREATE MATERIALIZED VIEW MV_DATA
REFRESH COMPLETE 
    ON DEMAND 
    --第一次刷新时间
    START WITH SYSDATE
    --每天凌晨一点刷新
    NEXT TRUNC(sysdate+1)+1/24 
WITH PRIMARY KEY 
DISABLE QUERY REWRITE AS
<查询sql>

(2) java后台 mybatis通过视图获取报表数据

<select id="queryDataList" resultType="com.dataVo" parameterType="map">
    SELECT * FROM MV_DATA mvd 
    WHERE 1 = 1
    AND
    <画面过滤条件>
</select>

(3) 获取物化视图上次刷新时间

<!-- 上次刷新时间 -->
<select id="getLastRefreshDate" resultType="java.util.Date">
    SELECT
      last_refresh_date
    FROM
      user_mviews
    WHERE
      mview_name = 'MV_DATA'
</select>

(4) 画面添加手动刷新物化视图的操作

由于java无法直接刷新物化视图,所以最后解决方案采用,在数据库创建存储过程,在存储过程中刷新物化视图。

包中追加存储过程方法
    CREATE OR REPLACE
    PACKAGE "REPORT" AS
	    PROCEDURE P_MV_DATA;
    END;
创建存储过程
    CREATE OR REPLACE
    package body REPORT is

    PROCEDURE P_MV_DATAIS
    BEGIN
    DBMS_MVIEW.REFRESH ( list => 'MV_DATA', Method => 'COMPLETE', refresh_after_errors                 => True
    );
    END;

end;

在mapper.xml中就可以调用存储过程啦~

<select id="refleshData" statementType="CALLABLE" >
 	{call REPORT.P_MV_DATA}
</select>

(5) 删除物化视图

DROP MATERIALIZED VIEW MV_DATA;

(6) 物化视图创建索引

create index IDX_MV_DATA_ID on MV_DATA(id);

3、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • oracle数据库在客户端建立dblink语法

    oracle数据库在客户端建立dblink语法

    oracle服务器没有建立目标数据库的TNS时,在客户端(有权限的情况下)建立dblink语法如下,有需求的朋友可以参考下哈
    2013-05-05
  • oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

    最近接了一个项目,其中项目需求,有一个非常纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰。接下来,通过本篇文章给大家介绍oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
    2015-11-11
  • Oracle平台应用数据库系统的设计与开发

    Oracle平台应用数据库系统的设计与开发

    Oracle平台应用数据库系统的设计与开发...
    2007-03-03
  • Oracle数据库安全策略分析(一)

    Oracle数据库安全策略分析(一)

    Oracle数据库安全策略分析(一)...
    2007-03-03
  • ORACLE RMAN复制数据库(Duplicate)详细指南

    ORACLE RMAN复制数据库(Duplicate)详细指南

    文章介绍了数据库复制的基本概念、用途、模式和关键要点,详细描述了实施步骤和配置示例,最后通过实战案例展示了如何使用RMAN Duplicate创建数据库副本,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • [Oracle] 浅析令人抓狂的ORA-01555问题

    [Oracle] 浅析令人抓狂的ORA-01555问题

    首先要说明的一点是:ORA-01555错误是一个“安全”的错误,它不会造成数据丢失或损坏,只是会让接收到该错误的查询无法继续。以下就是对发生ORA-01555错误的原因进行了介绍,需要的朋友可以参考下
    2013-07-07
  • oracle索引的测试实例代码

    oracle索引的测试实例代码

    这篇文章主要给大家介绍了关于oracle索引测试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • SQL 错误 [1722] [42000]: ORA-01722: 无效数字解决办法

    SQL 错误 [1722] [42000]: ORA-01722: 无效数字解决办法

    这篇文章主要给大家介绍了关于SQL 错误 [1722] [42000]: ORA-01722: 无效数字的解决办法,ORA-01722是一个错误代码,当试图将一个字符串转换为数字,但字符串无法转换为数字时会出现这个错误,需要的朋友可以参考下
    2024-06-06
  • oracle错误ORA-00054资源正忙解决办法

    oracle错误ORA-00054资源正忙解决办法

    ORA-00054是Oracle数据库中的一个常见错误,表示用户试图在正在被锁定的资源上执行不允许的操作,导致资源处于忙碌状态,下面这篇文章主要给大家介绍了关于oracle错误ORA-00054资源正忙的解决办法,需要的朋友可以参考下
    2024-01-01
  • Oracle关联表更新操作指南

    Oracle关联表更新操作指南

    这篇文章主要给大家介绍了关于Oracle关联表更新操作的相关资料, Oracle关联更新是一种用于更新多表中某个表的数据时,引用另一个表中的数据,以避免数据错误的技术,需要的朋友可以参考下
    2023-07-07

最新评论