Oracle 物化视图详解与实践

news2024/12/23 9:48:36

一.视图是什么?

普通视图只是存放在数据字典当中的子查询,本身没有数据,数据来源于基表,可以把普通视图当作编译好的sql语句。

二.物化视图是什么?

把查询到的数据存放起来,为了以后再次查询使用,与视图最大的区别就是它有自己的数据。
优点:
1.把查询到的数据存放起来,以后再次查询就非常方便。
2.物化视图省去了查询中所需要的数据库的处理。
缺点:需要额外的存储空间

实践案例:

首先导入测试sql:
CREATE TABLE DEPT
       (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
	DNAME VARCHAR2(14) ,
	LOC VARCHAR2(13) ) ;
CREATE TABLE EMP
       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
	ENAME VARCHAR2(10),
	JOB VARCHAR2(9),
	MGR NUMBER(4),
	HIREDATE DATE,
	SAL NUMBER(7,2),
	COMM NUMBER(7,2),
	DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
INSERT INTO DEPT VALUES
	(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES
	(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES
	(40,'OPERATIONS','BOSTON');
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-4-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-5-1987', 'dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
CREATE TABLE BONUS
	(
	ENAME VARCHAR2(10)	,
	JOB VARCHAR2(9)  ,
	SAL NUMBER,
	COMM NUMBER
	) ;
CREATE TABLE SALGRADE
      ( GRADE NUMBER,
	LOSAL NUMBER,
	HISAL NUMBER );
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT;

创建一个视图:
create view vw_1
as
select d.dname,sum(e.sal) sum_sal,avg(e.sal) avg_sal
from emp e,dept d
where d.deptno=e.deptno
group by d.dname;

前面说过普通视图相当于数据字典中的一个子查询,可以如下验证

select TEXT from user_views where view_name='VW_1';

查询视图vw_1的执行计划如下:
可以看到访问普通视图,找数据还会从emp和dept表中去找。
创建一个物化视图:
create materialized view mv_1
as
select d.dname,sum(e.sal) sum_sal,avg(e.sal) avg_sal
from emp e,dept d
where d.deptno=e.deptno
group by d.dname;
查询该物化视图查看执行计划:
可以看到现在执行计划不涉及到基表了。
比对查询速率:
普通视图:
可以看到做了0次物理读,7次一致性读。
物化视图:
可以看到做了4次一致性读,0次物理读,性能提升了一丢丢,原因是数据量太小了,数据量大一些代价就很明显了

三.物化视图的更新

oracle刷新类型:

完全刷新:先truncate,再执行查询.
快速(fast)刷新:根据物化视图日志中的记录,只刷新改变的数据.

oracle刷新模式:手动or自动

实践案例:

更新基表

比对两种视图现在的区别:
此时可以看到,物化视图没有刷新,现在我们想刷新物化视图,显而易见删了重建是最方便的,但如果数据量比较大,可能会很麻烦,所以现在我们可以选择手动刷新或自动刷新。
手动刷新:
刷新指定物化视图
execute DBMS_MVIEW_REFRESH('MV_1',parallelism => 10);
刷新一个到多个基表的物化视图
DBMS_MVIEW_REFRESH_DEPENDENT('MV_1');
刷新所有的物化视图
DBMS_MVIEW_REFRESH_ALL_MVIEWS;

自动刷新:

案例:创建一个能够快速刷新的物化视图,要求物化视图能清楚表中行的重复值

create table tml(c1 int,c2 int,c3 int);
insert into tml values(1,2,3);
insert into tml values(2,2,3);
insert into tml values(4,2,9);
insert into tml values(1,2,3);
insert into tml values(1,6,7);

创建物化视图日志: 一张表只有一个物化视图日志。

create materialized view log on tml with rowid,sequence (c1,c2,c3) including new values;

创建该物化视图:

create materialized view mv_2 refresh fast on commit as select c1,c2,count(*) from tml group by c1,c2;

其中refresh fast on commit的意思是在基表有commit操作,该物化视图会刷新。

group by c1,c2 进行分组去重。

可以看到,基表进行提交,物化视图自动更新。

四.查询重写

简介:把访问基表的查询改写成访问物化视图,从而提高查询速度。无需改变应用程序的代码,只需要创建一个允许查询重写的物化视图。

总而言之就是把访问基表的查询改写成访问物化视图。

创建一个允许查询重写的物化视图:
 

create materialized view mv_3 enable query rewrite as
select d.dname,sum(e.sal) sum_sal,avg(e.sal) avg_sal
from emp e,dept d
where d.deptno=e.deptno
group by d.dname;

再次查看执行计划

但是允许查询重写访问的数据可能是老的,这个时候我们可用用hint禁用查询重写 如下:

select/*+ NOREWRITE */ d.dname,sum(e.sal) sum_sal,avg(e.sal) avg_sal
from emp e,dept d
where d.deptno=e.deptno
group by d.dname;

可以看到又会访问基表了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NiFi1.25版本HTTPS模式下RestAPI使用入门

Apache NiFi 是一个强大的数据流处理工具,通过其 REST API,用户可以远程管理和控制数据流处理器。本文将介绍如何使用 NiFi 1.25 版本HTTPS 模式下Rest API,包括获取 token、获取组件信息、启动和停止组件、以及更改组件的调度频率等操作。 …

2.2动态库

动态库的特性 位置无关代码(PIC - position independent code) 库中的符号&#xff0c;不需要提前存储在可执行文件中&#xff0c;只有当链接时&#xff0c;可执行文件才会将需要的代码函数链接到内存中。 制作动态库 编写主函数 test.c #include<stdio.h> int main…

Java 设计模式系列:解释器模式

简介 解释器模式是一种行为型设计模式&#xff0c;它提供了一种构建抽象语法树的机制&#xff0c;并定义了如何解释这棵树。解释器模式属于编译原理中的语法制导翻译的范畴。 如上图&#xff0c;设计一个软件用来进行加减计算。我们第一想法就是使用工具类&#xff0c;提供对应…

优雅单片机之STM32C8T6----------程序下载(1)

0&#xff0c;C8T6系列 若想查看视频以及讲解&#xff0c;请查看B站或者抖音视频。 1&#xff0c;入门程序的下载&#xff08;本文&#xff09; 2&#xff0c;蓝牙控制&#xff08;待定&#xff09; 3&#xff0c;蓝牙小车&#xff08;待定&#xff09; 一&#xff0c;USB转…

springboot3 web

springboot web配置 springboot web的配置有&#xff1a; SpringMvc配置的前缀为&#xff1a;spring.mvcweb场景的通用配置为&#xff1a;spring.web文件上传的配置为&#xff1a;spring.servlet.multipart服务器相关配置为&#xff1a;server 接管SpringMVC 的三种方式 方…

深圳晶彩智能JC3636W518C开发环境Arduino IDE配置

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的&#xff0c;铝合金外壳&#xff0c;价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派&#xff0c;由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

Java File类(一) -- springboot项目根目录下进行文件的读取、写入与清空内容的操作

目录 1.存储的位置 2.FileOperationUtil工具类源代码 1.存储的位置 2.FileOperationUtil工具类源代码 import org.springframework.util.FileCopyUtils; import java.io.*; import java.nio.charset.StandardCharsets;/*** @ClassName FileOperationUtil* @Description 文件…

卡码网KamaCoder 101. 孤岛的总面积

题目来源&#xff1a;101. 孤岛的总面积 C题解&#xff1a;在卡码网KamaCoder 100. 岛屿的最大面积-CSDN基础上加了个孤岛flg进行修改 #include <iostream> #include <vector> #include <queue>#include <stdio.h> using namespace std;int res 0, t…

【2024_CUMCM】时间序列3-一元时间序列分析的模型

目录 时间序列的平稳性 弱平稳 白噪声序列 序列图 差分方程 滞后算子 AR(p)模型 概念 平稳 例子 MA(q)模型 ARMA(p,q) 自回归移动平均模型 平稳性 ACF自相关系数 PACF偏自相关函数 AR(1)模型图 MA(1)与AR(2)图 ARMA(1,1)图 ARMA模型的识别 ARMA模型的估计…

【计算机视觉】3D重建:使用MeshLab进行表面重建(以泊松重建为例)

一、MeshLab 1、简介 MeshLab是一款功能强大的开源三维网格处理软件&#xff0c;主要用于编辑、修复、简化和可视化三维三角形网格和点云数据。它支持PLY、STL、OBJ、3DS、COLLADA等多种常用的3D文件格式&#xff0c;提供了网格清理、修复、简化、纹理映射、参数化、布尔运算等…

多平台内网穿透工具-frp配置(下载安装、开机自启)

✨本教程使用Windows做客户端&#xff0c;Ubuntu做服务端。服务端需要能公网访问&#xff0c;可以去腾讯或者阿里购买vps。 本教程所采用的工具可在蓝奏云中下载。下载地址&#xff1a;https://wwt.lanzoue.com/b0fomaeta密码:1k1u frp官方文档地址&#xff1a;https://gofrp.o…

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…

【问题项目】freeswitch的web界面YouPBX —— 筑梦之路

开源地址&#xff1a;GitHub - JoneXiong/YouPBX: A great GUI manager for FreeSwitch 说明&#xff1a;该项目是基于python 2.7django开发 这里主要记录下搭建使用过程 # 拉取代码git clone https://github.com/JoneXiong/YouPBX.gitgit clone https://github.com/JoneX…

Spring Web MVC入门(2)(请求1)

目录 请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.后端参数重命名(后端参数映射) 非必传参数设置 5.传递数组 请求 访问不同的路径就是发送不同的请求.在发送请求时,可能会带一些参数,所以学习Spring的请求,主要是学习如何传递参数到后端及后端如何接收. 1.传递单…

局域网如何进行内网连接和外网连接

这里写目录标题 什么是局域网什么是内网和外网为什么使用局域网内网连接 --- 小型局域网数据发送过程交换机知道IP地址对应的MAC地址&#xff08;一对一单播&#xff09;交换机不知道IP地址对应的MAC地址&#xff08;一对多广播&#xff09;数据接收过程 外网连接中型或大型局域…

SpringCoud组件

一、使用SpringCloudAlibaba <dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2023.0.1.0</version><…

【Python】数据处理(mongodb、布隆过滤器、索引)

数据 数据预处理 df pd.read_csv(file_path, encodingANSI) csv的编码方式一定要用 ANSI。要不然会出现各种报错 import pandas as pd from datetime import datetime# 读取CSV文件 file_path book_douban.csv df pd.read_csv(file_path, encodingANSI)# 定义一个函数来…

提高项目透明度:有效的跟踪软件

国内外主流的10款项目进度跟踪软件对比&#xff1a;PingCode、Worktile、Teambition、Tower、Asana、Trello、Jira、ClickUp、Notion、Liquid Planner。 在项目管理中&#xff0c;确保进度跟踪的准确性与效率是每位项目经理面临的主要挑战之一。选用合适的项目进度跟踪软件不仅…

C++笔试强训5

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 x1&#xff0c;先x&#xff0c;再x–&#xff0c;while判断永远为真&#xff0c;故死循环 选D。 sizeof会计算\0,strlen不包括\0,并且strlen只计算\0之前的。 所以sizeof是10&#xff0c;strken是4 …

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…