mv物化視圖規範

隨着公司近幾年所開拓的業務領域不斷加強,同時也須要相應的業務軟件平臺做爲後臺支持,所以,信息中心所設計開發的軟件規模近幾年增加速度也很快。隨之而來的數據庫的容量和複雜程度也成倍增長。爲了提升數據庫的效率,實現標準化以及便於數據庫的統一管理,制定本規範,旨在以統一的標準指導開發人員正確使用物化視圖。
此處請填入文檔中的專業術語及解釋。
序號 術語/縮略語 全稱和說明
1 物化視圖(Materialized View) 物化視圖用來存儲數據副本或集合,能夠用來複制本地或遠程表的所有或者部分,或者複製對多個表的查詢結果。物化視圖可根據須要自動完成複製數據的自動刷新。



二、設計要求規範#

2.1 表關聯的物化視圖,若是使用fast刷新模式,只能用基於rowid的物化視圖。 數據庫

這是MV的技術限制要求。 jsp

2.2 不容許使用On Commit的刷新模式,須使用On Demand的模式進行刷新工做。 性能

爲不影響數據庫的性能,不容許使用On Commit的刷新模式,由於若是使用On Commit的刷新模式數據庫會將物化視圖的刷新操做做爲Commit事務處理的一部分來執行,從而增長了Commit完成的時間。 spa

2.3 On demand refresh方式的MV,不容許使用START WITH的自動刷新模式,要求自行開發用於物化視圖刷新的JOB。 設計

爲了便於管理,要求自行開發用於物化視圖刷新的JOB,並設置定時調度來代替物化視圖的自動刷新功能。爲刷新工做建立的JOB要遵照《JOB管理規範》。 日誌

2.4 不容許使用Force Refresh方式。 code

Force Refresh方式Oracle自動判斷是否知足Fast刷新條件,若是知足則進行Fast刷新,不然進行Complete刷新,使用Force Refresh方式帶有不肯定性,所以不容許使用Force Refresh方式。 對象

2.5 除了初始化數據和大的維護工做外,不能使用Complete Refresh方式,只能使用Fast Refresh方式。 索引

因爲Complete Refresh方式會將表清空後從新複製數據,將佔用大量的資源。所以除了初始化數據或者是很大的維護工做外,物化視圖不容許採用Complete方式進行刷新。 事務

2.6 若是存在預建表,且預建表再沒有其餘的用途,在刪除物化視圖時,須要同時刪除預建表。若想不刪除,需申請例外。

使用預建表方式建立的物化視圖,在刪除物化視圖後,所建的同名的預建表不會自動刪除,還能夠進行查詢操做,所以須要手動進行刪除。

drop materialized view 屬主.物化視圖名; drop table 屬主.預建表名;
例如:
drop materialized view olapdata.CAL_MONTH_SALES_MV; drop table olapdata.CAL_MONTH_SALES_MV;

2.7 刪除物化視圖時,若是是快速刷新的物化視圖,須要同時刪除物化視圖日誌。

在使用快速刷新時,須要建立基於物化視圖的日誌表,所以在刪除物化視圖時,同時須要刪除此日誌表。
注意:對於物化視圖和物化視圖日誌表不在同一個數據庫的狀況,在刪除物化視圖和物化視圖日誌表時,須要鏈接到相應的數據庫刪除對應的對象。
若是物化視圖和物化視圖日誌表是不一樣的Schema,在刪除物化視圖和物化視圖日誌表時,須要以不一樣的Schema用戶登陸並刪除,或臨時授予刪除權限。

drop materialized view log on 表屬主.表名;
例如:
drop materialized view log on olapdata.cal_month_sales;

2.8 爲了保證mview可以進行fast refresh,需在Materialized View Log建立時加入sequence參數。

sequence的做用在於肯定dml操做的前後順序,當對於多表進行mixed dml操做時,涉及到join+aggregate類型的mv要進行fast refresh則需設置sequence的關鍵字。

附錄#

附錄A 與物化視圖相關的包#

能夠經過DBMS_MVIEW來執行物化視圖的相關分析與刷新工做。

附錄B 物化視圖的索引與約束#

除了主鍵外,Oracle不會自動在複雜的物化視圖的列上建立任何索引,須要手工建立索引。
爲了提升查詢物化視圖的效率,有必要對常常使用的列上建立索引。

附錄C 物化視圖的刷新方式#

物化視圖的刷新方式說明

附錄D 物化視圖日誌表的結構#

任何物化視圖都會包括的列:
  • SNAPTIME$$:用於表示刷新時間。
  • DMLTYPE$$:用於表示DML操做類型,I表示INSERT,D表示DELETE,U表示UPDATE。
當基本發生DML操做時,會記錄到物化視圖日誌中,這時指定的時間4000年1月1日0時0分0秒。若是物化視圖日誌供多個物化視圖使用,則一個物化視圖刷新後會將它刷新的記錄的時間更新爲它刷新的時間。
  • COMMIT後,物化視圖mv_t_rowid刷新,將SNAPTIME$$列更新成本身的刷新時間。
  • OLD_NEW$$:用於表示這個值是新值仍是舊值。N(EW)表示新值,O(LD)表示舊值,U表示UPDATE操做。
  • CHANGE_VECTOR$$表示修改矢量,用來表示被修改的是哪一個或哪幾個字段。
  • 若是WITH後面跟了ROWID,則物化視圖日誌中會包含:M_ROW$$:用來存儲發生變化的記錄的ROWID。
  • 若是WITH後面跟了PRIMARY KEY,則物化視圖日誌中會包含主鍵列。
  • 若是WITH後面跟了OBJECT ID,則物化視圖日誌中會包含:SYS_NC_OID$:用來記錄每一個變化對象的對象ID。
  • 若是WITH後面跟了SEQUENCE,則物化視圖日子中會包含:SEQUENCE$$:給每一個操做一個SEQUENCE號,從而保證刷新時按照順序進行刷新。
  • 若是WITH後面跟了一個或多個COLUMN名稱,則物化視圖日誌中會包含這些COLUMN列。
相關文章
相關標籤/搜索