oracle8i物化视图日志,物化视图日志对UPDATE的影响

物化视图日志的功能是记录基表的DML修改,使得物化视图可以通过物化视图日志上的记录进行快速刷新。

那么物化视图日志记录基本修改的同时,是否会对基表的DML产生一定的影响。

由于物化视图日志会将UPDATE主键的操作变成DELETE和INSERT,那么实际上基表执行的是什么操作呢,下面做一个简单的测试验证一下,首先是不包含物化视图日志的情况:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO T VALUES (1, 'A');

已创建1行。

SQL> INSERT INTO T VALUES (2, 'A');

已创建1行。

SQL> UPDATE T SET ID = 3 WHERE ID = 1;

已更新1行。

SQL> COMMIT;

提交完成。

SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;

GROUP#  SEQUENCE# STATUS

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

1         31 INACTIVE

2         32 CURRENT

3         30 INACTIVE

SQL> COL MEMBER FORMAT A50

SQL> SELECT GROUP#, MEMBER FROM V$LOGFILE;

GROUP# MEMBER

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

1 E:\ORACLE\ORADATA\YTK92\REDO01.LOG

2 E:\ORACLE\ORADATA\YTK92\REDO02.LOG

3 E:\ORACLE\ORADATA\YTK92\REDO03.LOG

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK92\REDO02.LOG', SYS.DBMS_LOGMNR.NEW)

PL/SQL过程已成功完成。

SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQL过程已成功完成。

SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'T' AND SEG_OWNER = USER;

SQL_REDO

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

CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

insert into "YANGTK"."T"("ID","NAME") values ('1','A');

insert into "YANGTK"."T"("ID","NAME") values ('2','A');

update "YANGTK"."T" set "ID" = '3' where "ID" = '1' and ROWID = 'AAAH1NAAJAAAAJoAAA';

SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR

PL/SQL过程已成功完成。

下面添加物化视图日志,再执行一下更新操作:

SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

SQL> UPDATE T SET NAME = 'B' WHERE ID = 2;

已更新1行。

SQL> UPDATE T SET ID = 1 WHERE ID = 3;

已更新1行。

SQL> COMMIT;

提交完成。

SQL> SELECT ID, DMLTYPE$$, OLD_NEW$$ FROM MLOG$_T;

ID D O

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

2 U U

3 D O

1 I N

可以看到,对于非主键的更新再物化视图中就是一条更新记录,而对于主键的更新,再物化视图日志中记录了两条,一条删除,一条插入。

那么实际上Oracle是如何执行的,看看LOGMNR得到的结果:

SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;

GROUP#  SEQUENCE# STATUS

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

1         31 INACTIVE

2         32 ACTIVE

3         33 CURRENT

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK92\REDO03.LOG', SYS.DBMS_LOGMNR.NEW)

PL/SQL过程已成功完成。

SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQL过程已成功完成。

SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'T' AND SEG_OWNER = USER;

SQL_REDO

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

update "YANGTK"."T" set "NAME" = 'B' where "NAME" = 'A' and ROWID = 'AAAH1NAAJAAAAJoAAB';

update "YANGTK"."T" set "ID" = '1' where "ID" = '3' and ROWID = 'AAAH1NAAJAAAAJoAAA';

SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR

PL/SQL过程已成功完成。

可以看到,Oracle实际上执行的仍然是UPDATE语句,而不是DELETE加INSERT语句,物化视图日志上只不过是为了方便记录的假象。

SQL> UPDATE T SET ID = 2 WHERE ID = 2;

已更新1行。

SQL> DELETE T WHERE ID = 1;

已删除1行。

SQL> COMMIT;

提交完成。

SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;

GROUP#  SEQUENCE# STATUS

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

1         34 CURRENT

2         32 INACTIVE

3         33 ACTIVE

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK92\REDO01.LOG', SYS.DBMS_LOGMNR.NEW)

PL/SQL过程已成功完成。

SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQL过程已成功完成。

SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_NAME = 'T' AND SEG_OWNER = USER;

SQL_REDO

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

update "YANGTK"."T" set "ID" = '2' where "ID" = '2' and ROWID = 'AAAH1NAAJAAAAJoAAB';

delete from "YANGTK"."T" where "ID" = '1' and "NAME" = 'A' and ROWID = 'AAAH1NAAJAAAAJoAAA';

SQL> SELECT ID, DMLTYPE$$, OLD_NEW$$ FROM MLOG$_T;

ID D O

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

2 U U

3 D O

1 I N

2 U U

1 D O

SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR

PL/SQL过程已成功完成。

再看一下UPDATE语句主键的值不发生变化的情况,这时物化视图日志并没有拆分成DELETE和INSERT,显然,把UPDATE变成DELETE和INSERT语句只是物化视图日志的行为,而不是物化视图基表上实际执行的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值