前一篇博客用一个简单的示例描述了完全刷新的物化视图。完全刷新的物化视图每次刷新都需要对保存数据的基表执行delete操作,在将新的结果集insert到基表。为了减少这个开销,为了减少这个开销Oracle为我们提供了快速刷新物化视图。

实验之前先明确两个定义:

主表:SH.costs ,example中的示例表

基表:SH.mv_costs ,保存查询结果集的实体表,也就是“模拟物化视图”的真正保存数据的地方。

增量基表:记录主表数据变化的表

什么是快速刷新?

快速刷新就是增量刷新,只应用主表产生的insert、update、delete操作。就像是RMAN中的增量备份,只备0级增量备份后的变化。

快速刷新的实现需要在主表上创建一个日志文件,该文件记录了主表被修改的记录。其实该文件也是一张基表,保存了主表的增量变化。增量基表记录变化时依赖于主表的主键或者是rowid。当触发快速刷新后,增量基表中的变化数据会更新到物化视图的基表中,然后将自己清空等待主表的变化。从另一个角度来看增量基表采用了缓存的原理,将数据变化收集起来,分批次加载到物化视图基表,减少完全刷新的消耗。

下面通过一个实验来看看快速刷新的过程

[oracle@snow ~]$ sqlplus / as sysdba

SYS@cdb > conn sh/sh@pdb1

目前COSTS表中没有主键,在创建MV日志时只能使用ROWID

SH@pdb1 > col owner for a20

SH@pdb1 > col constraint_name for a20

SH@pdb1 > select owner,constraint_name,constraint_type from dba_constraints where table_name='COSTS';

OWNER CONSTRAINT_NAME C

-------------------- -------------------- -

SH SYS_C009967 C

SH SYS_C009966 C

SH SYS_C009965 C

SH SYS_C009964 C

SH SYS_C009963 C

SH SYS_C009962 C

SH COSTS_CHANNEL_FK R

SH COSTS_TIME_FK R

SH COSTS_PRODUCT_FK R

SH COSTS_PROMO_FK R

1. 采用rowid的方式创建物化视图日志

SH@pdb1 > create materialized view log on costs with rowid;

Materialized view log created.

如果有主键的话可以使用

SH@pdb1 > create materialized view log on costs with primary key;

2. 创建快速刷新的物化视图

SH@pdb1 > create materialized view mvf_costs

2 segment creation immediate

3 refresh with rowid fast on demand

4 as select promo_id,sum(unit_cost) cost from costs group by promo_id;

as select promo_id,sum(unit_cost) cost from costs group by promo_id

*

ERROR at line 4:

ORA-32401: materialized view log on "SH"."COSTS" does not have new values

错误提示刚刚创建的物化视图日志不符合要求。将其删除,调整后重新创建。

SH@pdb1 > drop materialized view log on costs;

Materialized view log dropped.

重新创建物化视图日志,并且添加Including new values字句。

其中sequence是通过promo_id和unit_cost记录DML操作的次序,当刷新时按照这个次序在基表上执行

SH@pdb1 >

create materialized view log on costs with rowid,

sequence(promo_id,unit_cost) including new values;

Materialized view log created.

让我们看看物化视图日志创建成功后会包含两个对象,其中MLOG$_COSTS是增量基表。当主表产生数据变化时,隐含的trigger会将其写入该表中。

SH@pdb1 > col object_name for a30

SH@pdb1 > select object_name,object_type from user_objects where object_name like '%_COSTS%';

OBJECT_NAME                    OBJECT_TYPE

------------------------------ -----------------------

I_MLOG$_COSTS                  INDEX

MLOG$_COSTSTABLE

修改后的物化视图日志满足要求,再次创建物化视图成功。

SH@pdb1 >

create materialized view mvf_costs

segment creation immediate

refresh fast with rowid on demand

as select promo_id,sum(unit_cost) cost from costs group by promo_id;

下面看看物化视图mvf_costs的家族成员吧。MVF_COSTS(MATERIALIZED VIEW)是数据的逻辑容器;MVF_COSTS(TABLE)是保存查询结果的基表;MLOG$_COSTS是增量基表保存主表COSTS的数据变化;I_SNAP$_MVF_COSTS是MV的唯一索引,它是Oracle为了提高刷新性能二自动创建的;I_MLOG$_COSTS是增量基表的索引。

SH@pdb1 > col object_name for a30

SH@pdb1 > select object_name,object_type from user_objects where object_name like '%_COSTS%';

OBJECT_NAME OBJECT_TYPE

------------------------------ -----------------------

I_MLOG$_COSTS                  INDEX

I_SNAP$_MVF_COSTS              INDEX

MLOG$_COSTS                    TABLE

MVF_COSTS                      TABLE

MVF_COSTS                      MATERIALIZED VIEW

下面开始测试一下刷新功能

向主表costs添加1000条数据

SH@pdb1 > insert into costs select * from costs where rownum < 1001;

1000 rows created.

SH@pdb1 > commit;

Commit complete.

检查增量基表会看到新增了1000条记录

SH@pdb1 > select count(*) from MLOG$_COSTS;

COUNT(*)

----------

1000

手工执行一次快速刷新

SH@pdb1 > exec dbms_mview.refresh('MVF_COSTS','F');

PL/SQL procedure successfully completed.

快速刷新执行完毕,增量基表中的数据不再有用。

SH@pdb1 >select count(*) from MLOG$_COSTS;

COUNT(*)

----------

0

下面是刷新前后物化视图的数据变化

SH@pdb1 > select * from mvf_costs;

PROMO_ID   COST

---------- ----------

999        9173508.88

350        242949.08

351        258268

SH@pdb1 > select * from mvf_costs;

PROMO_ID   COST

---------- ----------

999        9313900.88

350        242949.08

351        258268

上述实验对于刚刚接触物化视图的同学来说非常容易理解。我也从中收益过,特此分享一下。

oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解相关推荐

  1. [20150629]12c物化视图刷新Out of place

    [20150629]12c物化视图刷新Out of place.txt --11G物化视图刷新有1个参数atomic_refresh. --如果为false,采用的方式是truncate,再使用/*+ ...

  2. mysql 物化视图 更新_物化视图的快速刷新测试与物化视图日志

    前言:一般在创建物化视图的时候,在数据量不大的时候,刷新的方式都是采用完全刷新的.随着系统的使用一些物化视图的源表的数据量在不断的增长,原本采用完全方式几秒就能刷新完成的物化视图,现在需要等待很久的时 ...

  3. 创建物化视图commit_oracle 中物化视图讲解

    oracle 中物化视图讲解 oracle中的物化视图首先需要创建物化视图日志,oracle根据用户创建的物化视图日志来创建物化视图日志表,物化视图日志表名称为mlog$_基表名,如果表名超过20位, ...

  4. 创建数据库_详解Oracle数据库物化视图及创建物化视图索引

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

  5. oracle视图查询机制,物化视图及日志内部机制的一点研究

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构: SQL ...

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

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

  7. oracle 物化视图使用,Oracle 物化视图使用教程

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

  8. oracle 物化视图使用,ORACLE 物化视图使用

    当前位置:我的异常网» 数据库 » ORACLE 物化视图使用 ORACLE 物化视图使用 www.myexceptions.net  网友分享于:2013-08-18  浏览:20次 ORACLE ...

  9. oracle 物化视图没效果,物化视图失效的几种情况及测试

    说明:物化视图(Materialized Views)是查询的结果集,所有原表和视图的变更都将导致物化视图的失效,最近就发现了一个物化视图经常失效的问题,以下是整理的文档. 一.物化视图状态查询:OR ...

最新文章

  1. SQL2K数据库开发八之表操作创建主键
  2. JAVA调用C语言写的SO文件
  3. 课时20:内嵌函数和闭包
  4. CF#420 B. Okabe and Banana Trees 思维|暴力|几何
  5. 服务器云平台 系统,服务器云平台 系统
  6. Linux环境下2410开发板串口读写关键代码
  7. 详解回调函数(同步回调,异步回调)
  8. 在JAR中打包使用JAR库
  9. linux opendir路径_Linux C/C++ ----目录文件的操作(opendir,readdir,closedir)
  10. 【案例分享】KTV网络机顶盒
  11. 一分钟学会神经网络3——图解深度学习原理(有这篇博客就够了)
  12. 非阻塞套接字及select模型 select(0,fread,NULL,NULL,timeOut);
  13. matlab如何调整顺时针逆时针,关于算法:确定线段的方向是顺时针还是逆时针
  14. [MRI]核磁共振头线圈和体线圈
  15. 全系列三极管应用参数
  16. Mac老是自动关掉屏幕怎么办?
  17. 水利水电安全员考试问答练习题库(4)
  18. 字典 列表和集合习题
  19. Android adb.exe程序启动不起来 具体解决方法
  20. ros滑模控制_滑模变结构控制算法综述

热门文章

  1. Qt pro工程文件中判断宏定义是否存在
  2. 【已解决】R语言,在线升级
  3. NOIP 2014 联合权值
  4. android 消除标题,Android Activity 去掉标题栏及全屏显示
  5. wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用
  6. MySQL / 多版本并发控制
  7. Linux下getopt()函数的简单使用
  8. java语法特点是什么意思_java的语法是什么意思
  9. python循环捕捉异常_python异常捕捉以及处理
  10. c++输出小数点后几位_2.1 怎么在屏幕上输出各种类型的数据