设为首页 加入收藏

TOP

oracle物化视图实例讲解(二)
2018-04-17 09:08:02 】 浏览:404
Tags:oracle 物化 实例 讲解
bject identifier of the affected row objects.Combination: The materialized view records changes to the master table or master materialized view based any combination of the three options. It is possible to record changes based on the primary key, theROWID, and the object identifier of the affected rows. Such a materialized view log supports primary key,ROWID, and object materialized views, which is helpful for environments that have all three types of materialized views based on a master.

翻译:

主键:物化视图根据受影响行的主键记录对主表或主物化视图的更改。

行ID:物化视图根据受影响行的rowid记录对主表或主物化视图的更改。

Object ID:物化视图根据受影响行对象的对象标识符记录对主对象表或主对象物化视图的更改。

组合:物化视图记录基于这三个选项的任意组合对主表或主物化视图的更改。可以根据主键、ROWID和受影响行的对象标识符记录更改。这样的物化视图日志支持主键、ROWID和对象物化视图,这对于基于主目录拥有所有三种类型物化视图的环境很有帮助。

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

底层应该还是用到了类似的行级触发器;

如:

create materialized view log on emp

--可以指定表空间tablespacetest_space -- 日志空间

with primary key;

--查看物化视图的刷新情况

select *from USER_MVIEW_LOGS;

物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,

当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。

通过这个字典可以查找到具体的日志表;

通过日志表就可以知道更新情况;

--查看日志表

select *from MLOG$_EMP ;

SNAPTIME$$:用于表示刷新时间。

DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。

OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。

CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。

当刷新完成后MLOG$_EMP相应的日志记录,会被清空;

在刷新(同步)物化视图之前你可以做各种DML操作;

在你提交之前就会记录到日志表;

1.3 例子

都是自已亲测的,有什么不对的地方还望指出,谢谢1.3.1demand方式

--授权

grant creatematerialized viewto SCOTT;

--创建

create materializedview my_emp_view

build immediate

refresh force

on demand

disable query rewrite

as

select *from emp;

--等价下面的创建

create materializedview my_emp_view

as

select *from emp;

--可以发现,如果原表emp有主键,那么在创建物化视图的时候,会自动创建基于主键的索引在MY_EMP_VIEW中;

select *from all_indexes a where a.TABLE_NAMEin('EMP','MY_EMP_VIEW');

--建立非主键的索引,建立的索引跟源表没有关系

create index mater_idn_enameon my_emp_view(ename);

--查询物化视图信息

select *from all_tables aa where aa.TABLE_NAME='MY_EMP_VIEW';

--插入一条数据

Insert into emp(empno,ename,sal)values(1112,'无话2',9999);

select *from emp;

--此时查询发现物化视图没有主动更新

select *from my_emp_view;

--手动刷新

--'' use fastrefresh when possible

--'F' use fastrefresh or raise an error if not possible

--'C' perform acomplete refresh, copying the entire snapshot from

-- the master

begin

--如果要快速刷新,那么必须建立日志表

-- dbms_mview.refresh('MY_EMP_VIEW','F');

--如果全量更新,不需要建立日志表

-- dbms_mview.refresh('MY_EMP_VIEW','C');

dbms_mview.refresh('MY_EMP_VIEW');--等价

end;

/

此时如果执行会报错;没有创建日志表

--创建日志表

create materializedview log on emp

--可以指定表空间tablespace test_space --日志空间

with primary key;

再插入一条数据:

Insert into emp(empno,ename,sal)values(1114,'无话4',9999);

begin

dbms_mview.refresh('MY_EMP_VIEW','F');

end;

/

又报错了,应该是日志表后建造成的;

 

\

 

我们全量更新下就可以了;

begin

dbms_mview.refresh('MY_EMP_VIEW','C');

end;

/

--查看物化视图的更新等信息

select * from all_mviewsaa where aa.MVIEW_NAME='MY_EMP_VIEW';

再插条数据:

Insert into emp(empno,ename,sal)values(1115,'无话5',5555);

begin

dbms_mview.refresh('MY_EMP_VIEW','F');

end;

/

你会发现同步成功了;

查看日志表:是空的,同步完成会清空记录

select * from MLOG$_EMP

这种demand相对于commit有什么优势吗人家刷新前,你可以做各种各种的DML操作,最后可以手动一次性提交,效率肯定比commit高;

--删除物化视图

drop materializedview my_emp_view;

--删除物化视图的日志表

drop materializedview log on 源表名;

小结一下正确的创建流程

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Oracle数据库的常用操作语句 下一篇mysql最新面试题及答案分享

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目