小議物化檢視與基表資料不一致的消除(四)
這篇文章主要討論如何透過修改物化檢視日誌來同步包含LOB列的UPDATE操作。
小議物化檢視與基表資料不一致的消除(一):http://yangtingkun.itpub.net/post/468/326751
小議物化檢視與基表資料不一致的消除(二):http://yangtingkun.itpub.net/post/468/327727
小議物化檢視與基表資料不一致的消除(三):http://yangtingkun.itpub.net/post/468/490927
前面一篇文章描述瞭如何透過手工修改物化檢視日誌的方法UPDATE操作的同步。
一般來說,對於UPDATE操作,沒有必要關心具體需要修改的列,但是對於9i環境下包含LOB物件的物化檢視,在使用上一篇文章介紹的方法就存在問題了。
在9.2中,當表中包含LOB時,如果記錄的LOB欄位在基表和物化檢視中是一致的,那麼物化檢視日誌中新增記錄的時候,注意不要將LOB列包含在修改向量中,否則由於LOB儲存資訊很多,會降低物化檢視重新整理的效能。如果記錄的LOB欄位在基表和物化檢視中是不一致的,那麼在新增物化檢視日誌記錄的時候,需要明確指定LOB列被修改,否則物化檢視的重新整理不會同步LOB列。
看一個簡單的例子,基表和物化檢視查詢結果如下:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL> SELECT * FROM T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 UPDATE It has been updated.
2 B 1234
3 C TEST
SQL> SELECT * FROM MV_T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 A ABCDEFG
2 B 1234
3 C TEST
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 過程已成功完成。
SQL> SELECT * FROM MV_T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 A ABCDEFG
2 B 1234
3 C TEST
由於LOB列存在不同步的現象,如果還像上一篇文章中給出的方法,隨意寫入一個列修改值,將導致LOB列無法同步:
SQL> INSERT INTO MLOG$_T
2 VALUES (1, TO_DATE('4000-1-1', 'YYYY-MM-DD'), 'U', 'U', '04');
已建立 1 行。
SQL> UPDATE T SET NAME = 'D' WHERE ID = 3;
已更新 1 行。
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 過程已成功完成。
SQL> SELECT * FROM T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 UPDATE It has been updated.
2 B 1234
3 D TEST
SQL> SELECT * FROM MV_T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 UPDATE ABCDEFG
2 B 1234
3 D TEST
手工人工新增MLOG$記錄,使得ID為1的不一致的記錄的NAME列得到同步,但是LOB列並沒有同步。
因此在新增物化檢視日誌資訊的時候必須指定LOB列,CHANGE_VECTOR$$的值是2的N次方,而這個N就是LOB列對應的列的順序值。
但是需要注意的是,這個列的順序值表示從DBA_TAB_COLUMNS中得到的,而是從SYS.COL$表中獲取的:
SQL> SELECT POWER(2, INTCOL#)
2 FROM SYS.COL$
3 WHERE NAME = 'ADDRESS'
4 AND OBJ# =
5 (SELECT OBJECT_ID
6 FROM DBA_OBJECTS
7 WHERE WNER = USER
8 AND OBJECT_NAME = 'T');
POWER(2,COL#)
-------------
8
下面再次修改物化檢視日誌,並指定CHANGE_VECTOR$$為‘08’:
SQL> INSERT INTO MLOG$_T
2 VALUES (1, TO_DATE('4000-1-1', 'YYYY-MM-DD'), 'U', 'U', '08');
已建立 1 行。
SQL> UPDATE T SET NAME = 'E' WHERE ID = 3;
已更新 1 行。
SQL> SELECT * FROM T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 UPDATE It has been updated.
2 B 1234
3 E TEST
SQL> SELECT * FROM MV_T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 UPDATE ABCDEFG
2 B 1234
3 D TEST
SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')
PL/SQL 過程已成功完成。
SQL> SELECT * FROM MV_T;
ID NAME ADDRESS
---------- -------------------- ----------------------------------------
1 UPDATE It has been updated.
2 B 1234
3 E TEST
這次物化檢視的LOB欄位也得到同步。
關於物化檢視日誌欄位的詳細描述可以參考:http://yangtingkun.itpub.net/post/468/20498
關於物化檢視是如何利用物化檢視日誌進行快速重新整理的可以參考:http://yangtingkun.itpub.net/post/468/20584
物化檢視欄位級重新整理的文章:
物化檢視是否根據欄位進行重新整理(一):http://yangtingkun.itpub.net/post/468/201236
物化檢視是否根據欄位進行重新整理(二):http://yangtingkun.itpub.net/post/468/201607
物化檢視是否根據欄位進行重新整理(三):http://yangtingkun.itpub.net/post/468/203414
包含LOB的物化檢視快速重新整理:http://yangtingkun.itpub.net/post/468/493060
包含LOB的物化檢視快速重新整理(二):http://yangtingkun.itpub.net/post/468/493206
包含LOB的物化檢視快速重新整理(三):http://yangtingkun.itpub.net/post/468/493660
包含LOB的物化檢視快速重新整理(四):http://yangtingkun.itpub.net/post/468/493970
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1394352/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小議物化檢視與基表資料不一致的消除(二)
- 小議物化檢視與基表資料不一致的消除(一)
- 小議物化檢視與基表資料不一致的消除(三)
- 建立遠端基表的物化檢視
- 資料庫的物化檢視資料庫
- 物化檢視妙用__表同步使用物化檢視方法
- DB2資料庫物化檢視:MQT物化查詢表的使用DB2資料庫MQQT
- 資料複製_物化檢視
- Oracle 資料庫檢視與基表的關係Oracle資料庫
- 物化檢視日誌表被DROP後建立物化檢視報錯
- 物化檢視的快速重新整理測試與物化檢視日誌
- 物化檢視基礎概念、mview跨庫遷移表View
- 物化檢視--資料倉儲手冊
- Oracle資料庫中物化檢視的原理剖析Oracle資料庫
- 【物化檢視】根據物化檢視日誌快速重新整理物化檢視的過程
- oracle資料字典表與檢視Oracle
- Oracle 資料庫字典 檢視 基表Oracle資料庫
- 物化檢視如何快速完成資料聚合操作?
- [zt]prebuilt 物化檢視遷移資料庫UI資料庫
- 【物化檢視】幾種物化檢視日誌分析
- 建議開發員少用帶錶連結的檢視(此檢視非物化檢視)
- trigger和物化檢視同步表
- (轉)oracle資料庫之間 表複製方法二(物化檢視 方法)Oracle資料庫
- 回收基表的空間,造成物化檢視只重新整理了一部分資料
- oracle物化檢視Oracle
- 【MVIEW】Oracle通過物化檢視同步表資料及簡介ViewOracle
- 【ORACLE】物化檢視相關後設資料檢視欄位說明Oracle
- oracle10g partition分割槽表與物化檢視materialized viewOracleZedView
- 汽車之家基於 Apache Flink 的跨資料庫實時物化檢視探索Apache資料庫
- 普通檢視和物化檢視的區別
- 資料庫系統原理(四)——檢視與索引資料庫索引
- 資料庫鏈、物化檢視、高階複製方面資料庫
- 用exp、imp遷移包含物化檢視日誌的資料
- 物化檢視詳解
- oracle 建立物化檢視Oracle
- Oracle 物化檢視建立Oracle
- materialized view (物化檢視)ZedView
- 物化檢視 on commitMIT