11.2中物化視圖日誌可以指定COMMIT SCN,這時物化視圖重新整理就不需要時間戳記了,這篇簡單描述Oracle是如何?通過COMMIT SCN來進行重新整理的。
建立一個測試環境:
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database11gEnterprise Edition Release11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> CREATE TABLE T
2 (ID NUMBER PRIMARY KEY,
3 NAME VARCHAR2(30),
4 AGE NUMBER(3));
表已建立。
SQL> INSERT INTO T
2 SELECT ROWNUM, TNAME, ROWNUM
3 FROM TAB;
已建立18行。
SQL> CREATE MATERIALIZED VIEW LOG ON T
2 WITH COMMIT SCN;
實體化視圖日誌已建立。
SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST
2 AS SELECT * FROM T;
實體化視圖已建立。
對物化視圖基表進行修改:
SQL> INSERT INTO T
2 VALUES (20, 'TEST', 100);
已建立1行。
SQL> UPDATE T
2 SET NAME = 'TEST UPDATE'
3 WHERE ID = 1;
已更新1行。
SQL> DELETE T
2 WHERE ID = 2;
已刪除1行。
SQL> COMMIT;
提交完成。
SQL>COLCHANGE_VECTOR$$ FORMAT A30
SQL> SET NUMW 16
SQL> SELECT * FROM MLOG$_T;
ID D O CHANGE_VECTOR$$ XID$$
---------------- - - ------------------------------ ----------------
20 I N FE 2533498128696031
1 U U 04 2533498128696031
2 D O 00 2533498128696031
可以看到物化視圖日誌中記錄了INSERT、UPDATE和DELETE操作,由於指定了COMMIT SCN,物化視圖日誌中多出了XID$$列,而缺少了SNAPTIME$$列。
SQL> CREATE TABLE T_TIMESTAMP (ID NUMBER PRIMARY KEY);
表已建立。
SQL> CREATE MATERIALIZED VIEW LOG ON T_TIMESTAMP;
實體化視圖日誌已建立。
SQL> INSERT INTO T_TIMESTAMP VALUES (1);
已建立1行。
SQL> SELECT * FROM MLOG$_T_TIMESTAMP;
ID SNAPTIME$$ D O CHANGE_VECTOR$$ XID$$
---------------- -------------- - - ------------------------------ ----------------
1 01-1月-00 I N FE 2814912975871092
可以看到,即使不指定WITH COMMIT SCN,11.2的物化視圖日誌也會包含XID$$列,估計是為了實現統一的介面。
下面對重新整理過程進行TRACE,看看Oracle是如何?重新整理的:
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
會話已更改。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL過程已成功完成。
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/