小議物化檢視與基表資料不一致的消除(四)

dbhelper發表於2015-01-08

這篇文章主要討論如何透過修改物化檢視日誌來同步包含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$記錄,使得ID1的不一致的記錄的NAME列得到同步,但是LOB列並沒有同步。

因此在新增物化檢視日誌資訊的時候必須指定LOB列,CHANGE_VECTOR$$的值是2N次方,而這個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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章