物化檢視的CONSIDER FRESH語句(二)

yangtingkun發表於2010-06-22

物化檢視的修改語句ALTER MATERIALIZED VIEW包含了CONSIDER FRESH語句。透過這個語句可以使得資料庫認為物化檢視已經是重新整理後的狀態。同時可以使得這個物化檢視對於查詢重新生效。

這篇簡單討論CONSIDER FRESH語句對快速重新整理的影響。

物化檢視的CONSIDER FRESH語句(一):http://yangtingkun.itpub.net/post/468/501199

 

 

物化檢視的CONSIDER FRESH的一個重要特性就是維護了物化檢視的快速重新整理特性。

看一個簡單的例子:

SQL> DROP MATERIALIZED VIEW MV_T1;

實體化檢視已刪除。

SQL> DROP MATERIALIZED VIEW MV_T2;

實體化檢視已刪除。

SQL> DROP TABLE T PURGE;

表已刪除。

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

表已建立。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

實體化檢視日誌已建立。

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

實體化檢視已建立。

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

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> COL CHANGE_VECTOR$$ FORMAT A15
SQL> SELECT *      
  2  FROM MLOG$_T;

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

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 過程已成功完成。

SQL> SELECT *     
  2  FROM MV_T;

        ID NAME
---------- ------------------------------
         1 T

SQL> SELECT *
  2  FROM MLOG$_T;

未選定行

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

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT *
  2  FROM MLOG$_T;

        ID SNAPTIME$$     D O CHANGE_VECTOR$$      XID$$
---------- -------------- - - --------------- ----------
         2 01-1
-00     I N FE              2.2519E+15

SQL> ALTER MATERIALIZED VIEW MV_T
  2  CONSIDER FRESH;

實體化檢視已更改。

SQL> SELECT *
  2  FROM MLOG$_T;

未選定行

SQL> SELECT *
  2  FROM MV_T;

        ID NAME
---------- ------------------------------
         1 T

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

已建立 1 行。

SQL> SELECT *    
  2  FROM MLOG$_T;

        ID SNAPTIME$$     D O CHANGE_VECTOR$$      XID$$
---------- -------------- - - --------------- ----------
         3 01-1
-00     I N FE              2.8149E+15

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 過程已成功完成。

SQL> SELECT *
  2  FROM MV_T;

        ID NAME
---------- ------------------------------
         1 T
         3 ABC

可以看到,執行CONSIDER FRESH語句後,物化檢視重新整理對應的物化檢視日誌被從物化檢視日誌表中清除掉。這個操作執行之後,並不會影響物化檢視的繼續快速重新整理,只不過物化檢視中的資料會與基表中不同。

資料的不同可以透過修改物化檢視日誌的方式來修正,具體描述可以參考:

小議物化檢視與基表資料不一致的消除(一):http://yangtingkun.itpub.net/post/468/326751

小議物化檢視與基表資料不一致的消除(二):http://yangtingkun.itpub.net/post/468/327727

小議物化檢視與基表資料不一致的消除(三):http://yangtingkun.itpub.net/post/468/490927

小議物化檢視與基表資料不一致的消除(四):http://yangtingkun.itpub.net/post/468/494060

CONSIDER FRESH語句還有一個重要的功能,如果基表或物化檢視日誌導致物化檢視無法快速重新整理,而物化檢視本身和基表資料十分接近,且資料量比較大,那麼可以利用CONSIDER FRESH語句恢復物化檢視的快速重新整理能力:

SQL> UPDATE T          
  2  SET NAME = NAME;

已更新3行。

SQL> DROP MATERIALIZED VIEW LOG ON T;

實體化檢視日誌已刪除。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

實體化檢視日誌已建立。

SQL> UPDATE T  
  2  SET NAME = NAME;

已更新3行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;

*
1 行出現錯誤:
ORA-12034: "TEST"."T"
上的實體化檢視日誌比上次重新整理後的內容新
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 2558
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 2771
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 2740
ORA-06512:
line 1


SQL> ALTER MATERIALIZED VIEW MV_T
  2  CONSIDER FRESH;

實體化檢視已更改。

SQL> SELECT *
  2  FROM MLOG$_T;

未選定行

SQL> UPDATE T
  2  SET NAME = NAME;

已更新3行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')

PL/SQL 過程已成功完成。

這是一個簡單的小例子,避免了物化檢視日誌無法快速重新整理後必須重建的問題,但是資料的不一致性還必須使用者自己來解決。

 

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

相關文章