Oracle11gr2物化檢視日誌新增PURGE語句

yangtingkun發表於2010-03-15

11.2中,物化檢視日誌也新增了一些功能,物化檢視日誌新增了PURGE語句,使得物化檢視日誌的清除和物化檢視的重新整理分離,從而提高物化檢視的重新整理效能。

 

 

在以往的版本中,物化檢視重新整理完成之前,需要清除物化檢視日誌中的記錄,清除的標準是這些記錄沒有任何一個物化檢視的重新整理需要用到。

顯然,這個DELETE的操作勢必會影響物化檢視重新整理的效能。現在Oracle提供了專門的PURGE語句,使得物化檢視日誌的清除工作可以和重新整理分離開,這樣物化檢視重新整理的效能可以得以提高。

SQL> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.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> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

會話已更改。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:11:47

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

表已建立。

SQL> CREATE MATERIALIZED VIEW LOG ON T
  2  PURGE START WITH SYSDATE + 5/1440
  3  REPEAT INTERVAL '5' MINUTE;

實體化檢視日誌已建立。

SQL> CREATE MATERIALIZED VIEW MV_T
  2  REFRESH FAST
  3  AS SELECT * FROM T;

實體化檢視已建立。

SQL> INSERT INTO T
  2  VALUES (1, 'TEST', 18);

已建立 1 行。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 4000-01-01 00:00:00 I N FE                             2.8148E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 過程已成功完成。

SQL> SELECT * FROM MV_T;

        ID NAME                                  AGE
---------- ------------------------------ ----------
         1 TEST                                   18

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 2010-01-18 05:12:35 I N FE                             2.8148E+15

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:13:04

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:16:55

SQL> SELECT * FROM MLOG$_T;

未選定行

SQL> UPDATE T SET NAME = 'ABC';

已更新 1 行。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 4000-01-01 00:00:00 U U 04                             2.8149E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 過程已成功完成。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         1 2010-01-18 05:17:33 U U 04                             2.8149E+15

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:17:46

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2010-01-18 05:22:02

SQL> SELECT * FROM MLOG$_T;

未選定行

可以看到,物化檢視日誌的清除現在和物化檢視的重新整理沒有關係,而是根據物化檢視日誌建立時候指定的時間間隔,每5分鐘清除一次。

物化檢視日誌的清除語句可以在建立的時候指定,也可以通過ALTER MATERIALIZED VIEW語句進行修改,比如下面就將物化檢視日誌的重新整理修改為預設方式,也就是和以前版本保持一致的——物化檢視重新整理時清除物化檢視日誌:

SQL> ALTER MATERIALIZED VIEW LOG ON T PURGE IMMEDIATE SYNCHRONOUS;

實體化檢視日誌已更改。

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

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT * FROM MLOG$_T;

        ID SNAPTIME$$          D O CHANGE_VECTOR$$                     XID$$
---------- ------------------- - - ------------------------------ ----------
         2 4000-01-01 00:00:00 I N FE                             1.4075E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 過程已成功完成。

SQL> SELECT * FROM MLOG$_T;

未選定行

即使是PURGE IMMEDIATE方式清除物化檢視日誌,Oracle也可以選擇同步進行或非同步進行。同步方式就是以前版本的工作方式,而非同步方式Oracle會在重新整理後啟動一個SHEDULER JOB來完成日誌的清除,這種方式同樣可以提高物化檢視重新整理的效能。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-629542/,如需轉載,請註明出處,否則將追究法律責任。

相關文章