前言:一般在建立物化視圖的時候,在資料量不大的時候,重新整理的方式都是采用完全重新整理的。随着系統的使用一些物化視圖的源表的資料量在不斷的增長,原本采用完全方式幾秒就能重新整理完成的物化視圖,現在需要等待很久的時間才能重新整理完成。其實物化視圖從一開始就幫我們想好了解決方法:通過物化視圖日志來實作物化視圖的快速重新整理;
一、物化視圖日志的介紹
1.1 物化視圖快速重新整理的原理:要先了解完全重新整理的原理是先把物化視圖的資料全部删除,然後再把基表的資料插入到物化視圖中;但是當資料達到百萬級别的資料時,如果源表更新了一條資料,完全重新整理就得删除物化視圖的所有資料再進行插入;
而快速重新整理,會保留物化視圖的資料,然後基表的所有資料的變更記錄到物化視圖日志中。這樣如果源表資料還是百萬級别,且這個時候更新了一條資料,物化視圖重新整理的過程中根據物化視圖的日志,隻要更新修改的那條特定記錄,便可達到快速重新整理的作用;
簡單來講,物化視圖日志就是一個資料庫引擎自動偉華的表,用來跟蹤基表發生的變更;
1.2 物化視圖的重新整理方式:我們知道如果需要進行快速重新整理,則需要建立物化視圖日志。Oracle物化視圖日志根據不同物化視圖的快速重新整理的需要,可以建立為ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的清單。
二、物化視圖快速重新整理的測試
2.1 建立一個基表
CREATE TABLE T_JOHN ( NAME VARCHAR2(20 BYTE), SALE VARCHAR2(20 BYTE), ) TABLESPACE USERS RESULT_CACHE (MODE DEFAULT) PCTUSED 0 PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING; |
2.2 建立物化視圖MV_JOHN
CREATE MATERIALIZED VIEW MV_JOHN (NAME,SALE) TABLESPACE USERS PCTUSED 0 PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) NOCACHE LOGGING NOCOMPRESS NOPARALLEL BUILD IMMEDIATE USING INDEX TABLESPACE USERS PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) REFRESH FAST ON DEMAND WITH ROWID AS SELECT NAME,SALE FROM T_JOHN; |
REFRESH FAST ON DEMAND:在需要要的時候,進行快速重新整理;
2.3 建立物化視圖日志
CREATE MATERIALIZED VIEW LOG ON T_JOHN TABLESPACE USERS PCTUSED 0 PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) NOCACHE LOGGING NOPARALLEL WITH ROWID EXCLUDING NEW VALUES; |
WITH ROWID:通過ROWID的方式,重新整理物化視圖;
2.4 以上完成後,便可以在基表上面進行資料的修改;
運作手工重新整理後,可以檢視物化視圖的資料也更新了;
Begin Dbms_mView.Refresh('MV_JOHN'); End; |
三、物化視圖管理
3.1 ORACLE提供了視圖USER_MVIEW_LOGS可以檢視,使用者下物化視圖的重新整理情況

物化視圖日志的名稱為MLOG$_後面跟基表的名稱,如果表名的長度超過20位,則隻取前20位,當截短後出現名稱重複時,Oracle會自動在物化視圖日志名稱後面加上數字作為序号。
3.2 MLOG$_T_WZQ
--這是一個primarykey的物化視圖日志:
SQL> desc MLOG$_T_WZQ
Name Null? Type
------------------------------------------------- ------------
GROUP_ID VARCHAR2(10)
PARENT_GROUP_ID VARCHAR2(10)
SNAPTIME$$ DATE
DMLTYPE$$ VARCHAR2(1)
OLD_NEW$$ VARCHAR2(1)
CHANGE_VECTOR$$ RAW(255)
XID$$ NUMBER
相關解釋如下:
SNAPTIME$$:用于表示重新整理時間。
DMLTYPE$$:用于表示DML操作類型,I表示INSERT,D表示DELETE,U表示UPDATE。
OLD_NEW$$:用于表示這個值是新值還是舊值。N(EW)表示新值,O(LD)表示舊值,U表示UPDATE操作。
CHANGE_VECTOR$$:表示修改矢量,用來表示被修改的是哪個或哪幾個字段。
當重新整理完成後MLOG$_T_WZQ相應的日志也會被清除了,因為這些日志已經沒有儲存的必要了;
四、總結:物化視圖是一把利器,在調優的過程中會經常用到,快速重新整理也隻是物化視圖衆多功能中很小的一個,随着業務場景的增加和資料量的增長相信用到物化視圖的地方也會越來越多;
*********************************************************************************************************************
本文作者:JOHN QQ:1916066696 (請備注資料庫)
ORACLE技術部落格:ORACLE 獵人筆記 http://blog.itpub.net/12679300/
請掃描加微信号!
******************************************************************************************************************
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12679300/viewspace-1330064/,如需轉載,請注明出處,否則将追究法律責任。
轉載于:http://blog.itpub.net/12679300/viewspace-1330064/