物化檢視的CONSIDER FRESH語句(二)
物化檢視的修改語句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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 物化檢視的CONSIDER FRESH語句(三)IDE
- 物化檢視的CONSIDER FRESH語句(一)IDE
- oracle物化檢視系列(二)Oracle
- Oracle物化檢視語法Oracle
- Oracle11gr2物化檢視日誌新增PURGE語句Oracle
- Oracle物化檢視的建立及使用(二)Oracle
- 【ORACLE】常用物化檢視相關後設資料查詢語句Oracle
- oracle物化檢視日誌系列(二)Oracle
- 【物化檢視】根據物化檢視日誌快速重新整理物化檢視的過程
- SQL語句大全—檢視錶空間(二)SQL
- Oracle11gr2物化檢視日誌新增COMMIT SCN語句OracleMIT
- 物化檢視妙用__表同步使用物化檢視方法
- 【物化檢視】幾種物化檢視日誌分析
- 10G物化檢視PCT快速重新整理不再需要物化檢視日誌(二)
- 檢視低效的SQL語句SQL
- oracle物化檢視Oracle
- 普通檢視和物化檢視的區別
- 物化檢視的快速重新整理測試與物化檢視日誌
- 物化檢視詳解
- oracle 建立物化檢視Oracle
- Oracle 物化檢視建立Oracle
- materialized view (物化檢視)ZedView
- 物化檢視 on commitMIT
- Oracle普通檢視和物化檢視的區別Oracle
- 12c 物化檢視 - 理解完全重新整理的物化檢視工作原理
- 物化檢視匯出匯入可能導致物化檢視日誌的失效
- MySQL檢視建表語句MySql
- oracle 檢視死鎖語句Oracle
- ORACLE中的物化檢視建立Oracle
- 資料庫的物化檢視資料庫
- 物化檢視日誌表被DROP後建立物化檢視報錯
- oracle檢視建立物件的DDL語句Oracle物件
- 檢視語句執行的時間
- Oracle如何根據物化檢視日誌快速重新整理物化檢視Oracle
- calcite物化檢視詳解
- Oracle物化檢視詳解Oracle
- ORACLE物化檢視測試Oracle
- Oracle 物化檢視案例分享Oracle