oracle物化视图

物化视图定义

视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集,每次访问它都会导致这个查询语句被执行一次,为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。

物化视图与普通视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间,对一个物化视图查询的执行效率与查询一个表是一样的。

物化视图的优点是查询速度快,因为数据已经存在,查询物化视图就等同于查询一张表的数据。

物化视图的缺点就是占用空间,因为数据是真实存储的,而不像普通视图只是一条查询语句。

物化视图创建语法:

CREATE MATERIALIZED VIEW view_name 
[BUILD IMMEDIATE | BUILD DEFERRED]
refresh [FAST|COMPLETE|FORCE] 
[ON [COMMIT|DEMAND] | START WITH (start_time) NEXT (next_time)]AS
subquery

BUILD IMMEDIATE:是在创建物化视图的时候就生成数据。(默认)

BUILD DEFERRED:在创建时不生成数据,以后根据需要再生产数据。

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

refresh关键字后面可以指定的刷新方式有三种:FAST、COMPLETE、FORCE(默认),FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。

刷新的模式有两种:ON COMMIT和ON DEMAND(默认),ON COMMIT指基表发生COMMIT操作时自动刷新;ON DEMAND指需要手动刷新物化视图。

下面的实例都是基于oracle中scott用户自带的emp表和dept表数据进行操作:

类型一:手动刷新的物化视图

创建物化视图:

create materialized view MV_EMP
refresh force on demand
as
select e.ename,d.dname from emp e
left join dept d on e.deptno = d.deptno;

以上创建的含义就是创建一个名称为mv_emp的物化视图,视图数据的采用手动刷新的模式(on demand),自动选择增量或全量更新(refresh force)。

创建完成后,可以发现,在PL/SQL中,Tables和Materialized views中,都会显示刚才创建的物化视图对象。

查询物化视图数据:

往emp表中插入一条数据(15条记录):

查询物化视图数据(14条记录):

可以看到物化视图结果集中只有14条记录,最新插入的记录并没有被查询出来,这时因为刚才创建的物化视图是手动刷新模块(on demand),所以需要手动执行物化视图数据更新语句,进行数据更新操作。

手动刷新物化视图记录:

begindbms_mview.refresh('mv_emp');
end;

刷新后,再查询物化视图(15条记录):

这次数据跟emp表记录数一致了。

类型二:自动刷新的物化视图

create materialized view mv_emp1
refresh force on commit
as
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

以上创建的含义就是创建一个名称为mv_emp1的物化视图,视图数据的采用自动刷新的模式(on commit),自动选择增量或全量更新(refresh force)。

这里需要注意下,emp表和dept表关联的写法改了,以为如果使用left join关键字,会提示“无法为实体化视图设置 ON COMMIT 刷新属性”。

视图创建完毕,对视图进行查询(15条记录):

对emp表插入数据:

再查询物化视图:

发现物化视图的数据自动刷新了,跟emp表数据保持一致。

手动刷新和自动刷新两种刷新方式,根据实际情况进行选择,对数据实时性要求不高的,可以选择手动刷新,比如要做个每日报表,统计每天的数据情况,可以使用手动刷新(每天凌晨1点);对数据实时性要求高的,选择自动刷新。

类型三:创建时不生成数据的物化视图

create materialized view mv_emp2
build deferred
refresh force on commit
as
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

类型一和类型二,视图创建完毕,视图就自动加载了基表的数据,如果要想在视图创建完毕后,先不生成数据,在需要的时候再生成数据,则可以使用build deferred关键字进行设置。

查询生成的视图:

可以看到视图中没有任何记录。

如果想让视图中加载数据,则需要手动执行下数据更新的方法:

begindbms_mview.refresh('mv_emp2');
end;

执行完毕,再次查询,视图中就加载了最新的数据:

此时因为视图是提交时更新,所以在emp表数据变化时时,视图的数据会随之更新。

类型四:创建增量更新的物化视图

注意:创建增量刷新的物化视图,必须:

1.创建物化视图中涉及表的物化视图日志,记录基表发生了什么变化,用这些记录去更新物化视图。

2.在查询语句中,必须包含所有表的rowid(以rowid方式建立物化视图日志)

--为基表创建 物化视图日志
create materialized view log on emp with rowid;
create materialized view log on dept with rowid;

执行完毕后,在Tables中可以看到创建的日志表:

创建增量更新的物化视图,查询语句中必须加上基表的rowid

create materialized view mv_emp3
refresh fast on demand
as
select e.rowid erowid,d.rowid drowid, e.ename,d.dname 
from emp e, dept d where e.deptno = d.deptno;

以上创建的含义就是创建一个名称为mv_emp2的物化视图,视图数据的采用手动刷新的模式(on demand),增量更新(refresh fast)。

 

查询视图数据集:

对emp表删除一条数据,查看物化视图日志表中数据的信息:

手动进行刷新操作:

begindbms_mview.refresh('mv_emp3');
end;

物化视图的数据才会被更新,同步物化视图日志的数据被被清除,也就是说物化视图日志中的数据是待处理的数据,当物化视图更新后,物化视图日志中的数据就会被删除。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】一文掌握JVM垃圾回收机制

作为Java程序员,除了业务逻辑以外,随着更深入的了解,都无法避免的会接触到JVM以及垃圾回收相关知识。JVM调优是一个听起来很可怕,实际上很简单的事。 感到可怕,是因为垃圾回收相关机制都在JVM的C++层实现,我们在Java开发中看不见摸不着;而实际很简单,是因为它说到底,也…

听GPT 讲Rust源代码--library/alloc(2)

File: rust/library/alloc/src/vec/mod.rs 在Rust源代码中,rust/library/alloc/src/vec/mod.rs这个文件是Rust标准库中的Vec类型的实现文件。Vec是一个动态大小的数组类型,在内存中以连续的方式存储其元素。 具体来说,mod.rs文件中定义了以下…

开放路径最短优先协议OSPF基础

开放路径最短优先协议OSPF基础 对比RIP 对比距离矢量路由协议(RIP),OSPF协议交换的不是路由条目,而是链路信息,并通过SPF算法计算出最佳路由,链路状态信息内含有路由接口、IP地址、掩码、cost值等,进而形成了链路状态…

Linux--批量自动装机

实验环境 随着某公司业务不断发展,服务器主机的数量也迅速增长,对于功能变更或新采购的服务器, 需要重新安装CentOS7操作系统,为了提高服务器装机效率,要求基于PXE网络实现全自动无人值 守批量安装。 需求描述 > 服…

三、C语言中的分支与循环—break和continue语句(8)循环结构 完

本章分支结构的学习内容如下: 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句(4)分支结构 完 本章循环结构的…

如何用AI帮你写年会贺词

如何用AI帮你写年会贺词 又到了岁末年初了,上一期图文讲解了如何自己制作日程效率本: 手把手教你自己动手使用ONLYOFFICE制作2024年历日记本 现在继续,讲一讲如何使用人工智能AI来帮我们编写公司年会贺词。所有公司都会在年底的时候开一个…

摩尔线程S80 对Unity HDRP的提示:硬件不支持体积材质球

错误 Hardware not supported for Volumetric Materials UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)解决方式 无。 会在运行的时候出发,不会暂停play,但是会一直出现error的log。 使用URP不会提示这些错误, 目的 提示…

2023-12-16 LeetCode每日一题(统计区间中的整数数目)

2023-12-16每日一题 一、题目编号 2276. 统计区间中的整数数目二、题目链接 点击跳转到题目位置 三、题目描述 给你区间的 空 集,请你设计并实现满足要求的数据结构: **新增:**添加一个区间到这个区间集合中。 **统计:**计算…

从零开始做题:逆向wdb_2018_3rd_soEasy

1.题目信息 2.解题原理 使用kali2023环境,具体见从零开始配置kali2023环境:安装最新免费IDA版本8.3-CSDN博客 giantbranchubuntu:~/Re/2$ checksec ./wdb_2018_3rd_soEasy [*] /home/giantbranch/Re/2/wdb_2018_3rd_soEasyArch: i386-32-littleREL…

如何通过使用说明书的优化降低售后支持成本?

随着市场竞争的加剧,售后服务已成为企业保持竞争优势的关键因素之一。而使用说明书作为产品的重要组成部分,与售后服务之间存在着密切的关系。接下来就探讨一下如何通过优化使用说明书降低售后支持成本,提升售后服务质量。 一、使用说明书对售…

PAT乙级1045 快速排序

著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元…

SpringBoot + Vue 抖音全平台项目

简介 本项目是一个短视频平台,拥有热度排行榜,热门视频,兴趣推送,关注推送,内容审核等功能。 源码下载 网盘 (访问密码: 8418) 登录/注册 首页 创作中心 架构设计 上传视频业务流程 视频推送流程 1.用户订阅分类后…