Oracle物化视图刷新和物化视图日志

news2024/11/25 0:53:06

Oracle物化视图刷新和物化视图日志

Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
测试物化视图的刷新,参考物化视图日志,一个源表对应多个物化视图刷新。
物化视图是实体表,是物理真实存在的(与View区别),占用存储空间的,可以创建索引,可以使用分区表。

1.测试环境

(1)源表

按主键刷新,主键userid 。

create table TEST_MV_MASTER
(
  userid     VARCHAR2(32) not null,
  name       VARCHAR2(8),
  birthdate  DATE,
  createdate DATE default sysdate,
  score1     INTEGER,
  score2     INTEGER
);
-- 增加主键
alter table test_mv_master add constraint pk_userid primary key (userid);

(2)物化视图日志

在源表上建物化视图日志,作 insert update delete 数据变更的记录。
物化视图有两种:默认是通过主键,另一种是通过ROWID,创建物化视图是需要有 WITH ROWID 子句,根据主键或者ROWID更新数据。

SQL> create materialized view log on test_mv_master ;

Materialized view log created


Executed in 0.208 seconds

(3)数据脚本

测试脚本,insert delete update 三类数据变更的操作。

declare
  i integer;
begin

  -- 准备三类变化数据,insert update delete 三类
  for i in 0..50 loop
    insert into test_mv_master
    values
      (sys_guid(),
       dbms_random.string('u', 8),
       to_date(2451545 + trunc(DBMS_RANDOM.VALUE(0, 365 * 3)), 'J'),
       sysdate,
       abs(mod(dbms_random.random, 100)),
       abs(mod(dbms_random.random, 100)));
   end loop;
   commit;

   update test_mv_master t set t.score1 = t.score1 + 20 where t.score1<20;  
   
   delete test_mv_master t where t.score2 < 20;  
   commit;
   
end;
/

2.物化视图刷新

物化视图有两种:默认是通过主键,另一种是通过ROWID,创建物化视图是需要有 WITH ROWID 子句。即根据主键或者ROWID更新数据。
本例通过主键更新物化视图。

(1)创建物化视图

mv_source1 是test_mv_master全表的物化视图

create materialized view mv_source1
  tablespace tb_crm
build deferred
refresh fast
  disable query rewrite as
  select *
  from 
test_mv_master;

mv_source2 是test_mv_master的条件物化视图

create materialized view mv_source2
  tablespace tb_crm
build deferred
refresh fast
  disable query rewrite as
  select *
  from 
test_mv_master t where t.score1>= 60 and t.score2>=60; 

(2)全量刷新

物化视图创建完成后,第一次必须是全量刷新。否则提示错误:

ORA-12057: materialized view or zonemap “MV_SOURCE1” is invalid and must use complete refresh

SQL> EXEC DBMS_MVIEW.REFRESH(LIST =>'MV_SOURCE1',METHOD=>'C',PARALLELISM=>2);

PL/SQL procedure successfully completed


Executed in 0.311 seconds

SQL> EXEC DBMS_MVIEW.REFRESH(LIST =>'MV_SOURCE2',METHOD=>'C',PARALLELISM=>2);

PL/SQL procedure successfully completed


Executed in 0.268 seconds

(3)增量刷新

SELECT * FROM MLOG$_TEST_MV_MASTER T;

在这里插入图片描述
当基本发生DML操作时,会记录到物化视图日志中,这时指定的时间4000年1月1日0时0分0秒。物化视图日志可以供多个物化视图使用,则一个物化视图刷新后会将它刷新的记录的时间更新为它刷新的时间。

INSERT为FE,DELETE为00,UPDATE为20 ,对第一列的更新为02,第二列为04,第二列和第三列都更新为0C。

执行数据脚本后,可以执行物化视图增量(快速)刷新 。

SQL> EXEC DBMS_MVIEW.REFRESH(LIST =>'MV_SOURCE1');

PL/SQL procedure successfully completed


Executed in 0.31 seconds

再次查询物化视图日志,刷新时间为当前时间:

SELECT * FROM MLOG$_TEST_MV_MASTER T;

在这里插入图片描述

SQL> EXEC DBMS_MVIEW.REFRESH(LIST =>'MV_SOURCE2');

PL/SQL procedure successfully completed


Executed in 0.349 seconds

再次查询物化视图日志,变更记录全部更新完毕,清空日志记录。

SELECT * FROM MLOG$_TEST_MV_MASTER T;

3. 物化视图的关键知识点

(1)创建方式(Build Methods)

包括BUILD IMMEDIATE和BUILD DEFERRED两种。
BUILD IMMEDIATE是在创建物化视图的时候就生成数据。默认为BUILD IMMEDIATE。
BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。

(2)查询重写(QueryRewrite)

包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。

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

(3)刷新(Refresh)

指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。
ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新,即更新物化视图,以保证和基表数据的一致性。
ON COMMIT是指,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。对基表,平常的COMMIT在0.01秒内可以完成,但在有了ON COMMIT视图后,居然要6秒。速度减低了很多倍。ON COMMIT视图对基表的影响可见一斑。

注意:设置REFRESH ON COMMIT的物化视图不能访问远端对象。

物化视图有三种刷新方式:COMPLETE、FAST和 FORCE。
完全刷新(COMPLETE),会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。

快速刷新(FAST),采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FAST必须创建基于主表的视图日志。对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。

强制刷新(FORCE),Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。
Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle通过一个物化视图日志还可以支持多个物化视图的快速刷新

物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

4. 物化视图的数据字典

(1)MLOG$_

物化视图日志的名称为MLOG$_后面跟源表的名称。

物化视图都会包括的4列状态数据:

SNAPTIME$$:用于表示刷新时间。
DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。
OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。
CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。
如果WITH后面用ROWID,则物化视图日志中会包含:M_ROW

建立快速刷新的两个物化视图来演示时间列的变化。只有建立快速刷新的物化视图才能使用物化视图日志,如果只建立一个物化视图,则物化视图刷新完会将物化视图日志清除掉。如果一个源表对应多个物化视图,需要所有物化视图都刷新完成,才能将物化视图日志清除。

(2)user_mviews

用户下物化视图的信息,包括物化视图名称,更新方式,使用的数据链路名称,更新的时间 。

(3)user_mview_keys

可以查询源表对应的物化视图名称,使用到源表的字段名以及顺序。

select * from user_mview_keys t order by t.mview_name,t.position_in_select ;

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

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

相关文章

【Linux工具篇】项目自动构建化工具-make/Makefile

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 &#x1f4ab…

matlab cross()函数叉乘 计算过程详解

向量叉乘 在数学上&#xff0c;两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中&#xff0c;用函数cross实现。 函数 cross() 格式 C cross(A,B) %若A、B为向量&#xff0c;则返回A与B的叉乘&#xff0c;即CAB&#xff0c;A、B必须是3个…

c#封装bool到cpp

c#那边传一个结构体&#xff0c;结构体里包含两个bool&#xff0c;封送到cpp&#xff0c;结果发现cpp那边读取有问题。一看cpp接收变量的内存&#xff0c;两个bool占的内存都不是一个字节了&#xff0c;再次记录原因。 封送的时候&#xff0c;默认是占4个字节&#xff0c;如果…

Pycharm----导入库文件夹不在py文件的目录下

问题描述&#xff1a; 想在不同目录下导入根目录的包&#xff0c;直接写会报错。如下边object_detect.py在function文件夹下&#xff0c;导入包默认在这个文件下&#xff0c;但我想导入根目录models和utils下的包 解决方法&#xff1a; 将根目录设置为源代码根目录&#xff0…

linux静态库,动态库总结

1.介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据&#xff0c;这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化&#xff0c;更容易重新编译&#xff…

【Spring Cloud】Hystrix熔断机制

文章目录 前言什么是hystrix的熔断&#xff1f;使用hystrix熔断功能的配置Hystrix 工作原理Hystrix工作流 前言 什么是hystrix的熔断&#xff1f; hystrix熔断主要是指在一定的时间窗口内&#xff0c;当请求的次数达到一定的失败比率后&#xff0c;hystrix就会主动拒绝服务&a…

【图像分割】基于浣熊优化算法COA的Otsu(大津法)多阈值电表数字图像分割 电表数字识别【Matlab代码#52】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 多阈值Otsu原理3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 原始…

长尾式差分放大电路

3.3.2差分放大电路 电路 条件 静态分析 对共模信号的抑制作用 当产生温度变化时&#xff0c;也类似加入了共模信号&#xff0c;由于负反馈电阻 的存在&#xff0c;会产生如下变化。 对差模信号的放大作用 电路 交流等效电路 具体分析 具有恒流源的差分放大电路 电路 详细分析…

STM32 OLED显示汉字及屏幕滚动(I2C协议)

文章目录 一、任务目标二、材料准备硬件&#xff1a;软件&#xff1a; 三、AHT20温湿度传感器的使用四、OLED的使用1.硬件2.字模汉字编码原理取字模 3.工程4.电路连接5.实验效果 五、总结六、参考资料 一、任务目标 理解OLED屏显和汉字点阵编码原理&#xff0c;使用STM32F103的…

Linux下基本指令 -> ls指令

​ Linux - ls 1 简介2 简介3 语法4 常用选项4.1 -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件4.2 -l 列出文件的详细信息4.3 -d 将目录象文件一样显示&#xff0c;而不是显示其下的文件4.4 -i 输出文件的 i 节点的索引信息4.5 -n 用数字的 UID,GID 代替名称4.…

Qt学习14:Designer设计师

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 Qt项目地址及源码&#xff1a;点击这里 什么是Designer设计师&#xff1f; 简单来说就是通过拖拖拽拽就可以实现窗口上控件的布局。 1. 创建带UI文件的项目 我们在之前的学习中都是不用这个按钮的&#xff0c;现在我们需…

富文本CKEditor5简易入门,包括自定义上传图片(html版+vue.js)

一、安装及引入 官网&#xff1a;https://ckeditor.com/ckeditor-5/download/ 我这边使用的是自定义构建&#xff0c;然后下载下来。 二、简单使用 引入js <script src"../../../assets/plugins/ckeditor5/ckeditor.js"></script>html&#xff1a;…

【PWN · ret2libc】[BJDCTF 2020]babyrop

这题是经典的ret2libc&#xff0c;而且保护开的也不多&#xff0c;实际上&#xff0c;这篇博客的意义更大&#xff1a; 【PWN ret2libc】[2021 鹤城杯]babyof_Mr_Fmnwon的博客-CSDN博客 目录 前言 一、题目 二、思路 三、exp具体编写 总结 前言 简单而纯粹的ret2libc&am…

《DocRED: A Large-Scale Document-Level Relation Extraction Dataset》阅读笔记

引言 近期关注篇章级关系抽取&#xff0c;两个原因&#xff0c;一是之前做大规模知识抽取&#xff0c;遗留的一块内容就是篇章级关系抽取和事件抽取&#xff1b;另一个是大模型目前在抽取任务&#xff0c;特别是复杂抽取任务上表现不如其他NLP任务&#xff0c;这也引起我的研究…

5.2.6.字符设备驱动工作原理1

什么是模块&#xff1f;什么是驱动&#xff1f; 模块 驱动的雏形&#xff0c; 你要能操控硬件才叫驱动 在空的模块的基础上&#xff0c;安装驱动 5.2.6.1、系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API&#xff1a;open、read、write、close等 (3)驱动…

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效!

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效&#xff01; 2023/7/20 12:42 &#xff1f;做YouTube挣钱吗&#xff1f; 115网盘 满了。最新 张家界 旅游的视频 放到 youtube就是 60岁/老了的时候的回忆&#xff01; 放到 大陆不保险&#xff01; 如需使用自动翻…

智能合约安全审计

智能合约安全审计的意义 智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用…

Spring(二):更简单的存储与读取 Bean

通过上一章的Spring&#xff0c;我们基本实现了Spring 的读取与存储&#xff0c;但是在操作过程中&#xff0c;读取与存储并没有那么得“简单” 一套流程还是很复杂&#xff0c;所以&#xff0c;本章来介绍更加简单得读取与存储。 在 Spring 中想要更简单的存储和读取对象的核…

【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】继承基础知识及简单应用&#xff0c;使用reportSingleClassLayout&#xff08;在Visual Studio开发人员命令提示窗口&#xff09;查看派生类详细信息 website&#xff1a;黑马程序员C date&#xf…

MySQL 读写分离

目录 一、什么是读写分离&#xff1f; 二、为什么要读写分离呢&#xff1f; 三、什么时候要读写分离&#xff1f; 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1&#xff09;基于程序代码内部实现 2&#xff09;基于中间代理层实现…