物化视图日志的功能是记录基表的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语句只是物化视图日志的行为,而不是物化视图基表上实际执行的情况。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-351786/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-351786/