近期项目中遇到有关报表查询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 = 1AND<画面过滤条件>
</select>

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

<!-- 上次刷新时间 -->
<select id="getLastRefreshDate" resultType="java.util.Date">SELECTlast_refresh_dateFROMuser_mviewsWHEREmview_name = 'MV_DATA'
</select>

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

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

包中追加存储过程方法CREATE OR REPLACEPACKAGE "REPORT" ASPROCEDURE P_MV_DATA;END;
创建存储过程CREATE OR REPLACEpackage body REPORT isPROCEDURE P_MV_DATAISBEGINDBMS_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物化视图优化多表查询速度相关推荐

  1. oracle 物化视图、中间表的方案

    物化视图 有个项目因为有比较多的查询汇总,考虑到速度,所以使用了物化视图.简单的把用到的给整理了下.先看简单创建语句: create materialized view mv_materialized ...

  2. oracle olap创建物化视图,CUUG oracle物化视图讲解

    1.视图是什么? 普通视图:只是存放在数据字典当中的子查询,本身没有来源于基表 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化 ...

  3. Oracle 物化视图(MV)详解

    物化视图(MV)是在Oracle Database 7中引入的技术.改功能原来称为快照,现在术语"快照"用于描述一下数据字典结构.MV可以执行实时的SQL查询操作,并将操作 结果存 ...

  4. Oracle物化视图:创建最简单物化视图

    物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,oracle都实际上转换为视图SQL语 ...

  5. oracle技术之Oracle 物化视图(一)

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

  6. Oracle物化视图的创建及使用(一

    Oracle物化视图的创建及使用  http://blog.csdn.net/tegwy/article/details/8935058  先看简单创建语句: create   materialize ...

  7. Oracle物化视图的简单使用

    最近有个项目因为有比较多的查询汇总,之前用的是oralce的临时表,但临时表的特性导致无法完成业务需求,所以使用了物化视图. 先看简单创建语句: //创建物化视图 create materialize ...

  8. Oracle物化视图和普通视图区别

    一.物化视图的简介 物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际 ...

  9. Oracle物化视图与物化视图日志

    文章目录 物化视图 物化视图与普通视图的区别 创建一个存放person的表 创建一个存放person的address的表 初始化数据 创建物化视图的语句 1.build [immediate|defe ...

最新文章

  1. [cocos2dx UI] CCLabelAtlas 为什么不显示最后一个字
  2. js原生设计模式——2面向对象编程之继承—new+call(this)组合式继承
  3. 基于订阅的服务通讯架构体系
  4. linux 读取png图片,linux 下 OpenGL 读取 JPG, PNG, TAG 纹理数据
  5. openssl 生成证书_CentOS7 httpd(Apache)SSL 证书部署
  6. java酒店信息管理系统_java实现酒店管理系统
  7. bom展开算法 java程序实现_java实现aprior算法
  8. [python基础] 浮点数乘法的误差问题
  9. java中类与方法叙述正确的是
  10. plsa java代码_LDA主题聚类学习小结
  11. 【数学优化】学习知识点
  12. java实现文件夹的复制(包括子文件夹以及子文件)
  13. 十大ERP系统排行榜—2022年
  14. 【SSD目标检测】1:图片、视频内的物体检测与定位
  15. php生成二维码文字图片海报
  16. 如何将中文转为计算机语言,怎么将中文系统变成英文系统
  17. ZYNQ-7 PS的中断
  18. 【自然语言处理】BERT GPT
  19. 天池竞赛 | 中医药领域的问题生成冠军方案
  20. IDEA--安装、使用

热门文章

  1. 教你如何mysql远程访问数据库
  2. 弹性盒子对齐方式总结【建议收藏】
  3. php开发APP接口(一)
  4. 【Android】android开发---实现屏幕旋转的两种方法
  5. Android 合并mp4与m4a,在android中使用ffmpeg将mp4转换为m4a
  6. 如何播放.wrf文件
  7. android休眠唤醒java_Android-WakeLock(唤醒锁与CPU休眠/屏幕常亮)
  8. 降噪耳机哪个牌子好又平价?降噪耳机性价比排行
  9. win10 命令行工具cmd乱码解决方案及cmd非常用命令chcp介绍
  10. SwiftUI 绘图类精品项目大全之使用 SwiftUI 开发所见即所得的绘图应用程序 (教程含源码)