物化視圖 materialized view基礎學習

一、物化視圖定義摘錄:
   物化視圖是包括一個查詢結果的數據庫對像(由系統實現定期刷新數據),物化視圖不是在使用時纔讀取,而是預先計算並保存表連接或聚集等耗時較多的操作結果,這樣在查詢時大大提高了讀取速度,特別適用抽取大數據量表某些信息以及數據鏈連接表使用。而且在數據倉庫中使用到重寫機制,對於用戶來說,Oracle會自己選擇合適的物化視圖進行查詢,不需要重新寫SQL。

   物化視圖還可以進行遠程數據的的本地複製,此時的物化視圖存儲也可以稱爲快照。可是用於實施數據庫間的同步。通常情況下,物化視圖用於複製的時候爲“主表”,而在運用於數據倉庫時稱爲“明細表”。

其物理意義:

(1) 物化視圖在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到佐證;

(2) 物化視圖也是一種段(segment),所以其有自己的物理存儲屬性;

(3) 物化視圖會佔用數據庫磁盤空間,這點從user_segment的查詢結果,可以得到佐證;  


物化視圖相關的參數:

COMPATIBLE 需大於 8.1.0

QUERY_REWRITE_ENABLED = TRUE 開啓查詢重寫(默認

QUERY_REWRITE_INTEGRITY =

  ENFORCED - 查詢僅用Oracle強制與保證的約束、規則重寫(默認);

  TRUSTED – 查詢除用Oracle強制與保證的約束、規則,也可用用戶設定的數據間的任何關係來重寫;

  STALE_TOLERATED – 即便Oracle知道物化視圖中數據過期(與事實表等不同步),也重寫查詢。

JOB_QUEUE_PROCESSES,必須設置大於 1。

OPTIMIZER_MODE,必須設置成CBO的某種方式。


二、物化視圖的創建
1.創建物化視圖時應先創建物化視圖日誌,主要是爲了可以讓物化視圖進行fast刷新,最好讓日誌放在一個單獨的表空間

複製代碼
createtable t1 asselect*from dba_objects;altertable t1 addconstraint pk_t1 primarykey (object_id); create materialized viewlogon t1 tablespace users;create materialized view mv1 refresh force oncommitasselect*from t1;select*from user_mview_logs;drop materialized viewlogon t1;select*from user_mviews;drop materialized view mv1;
複製代碼


-----創建物化視圖日誌具體語法

CREATE MATERIALIZED VIEWLOGON table_name TABLESPACE  tablespace_name WITHprimarykey/rowid;

primary key 和 rowed  
PRIMARY KEY選項生成主鍵物化視圖,也就是說物化視圖是基於主表的主鍵。
PRIMARY KEY是默認選項,爲了生成PRIMARY KEY子句,應該在主表上定義主鍵,否則應該用基於ROWID的物化視圖。
主鍵物化視圖允許識別物化視圖主表而不影響物化視圖增量刷新的可用性。
Rowid物化視圖只有一個單一的主表,不能包括“Distinct、聚合函數、Group by、子查詢、連接、SET操作”


-----創建物化視圖具體語法

複製代碼
CREATE MATERIAILZED VIEW my_materializedTABLESPACE tablespace_name /*保存表空間*/BUILD immediate/deferred  /*是否立刻生成數據*/enable/disable QUERY REWRITE  /*是否開啓查詢重寫*/REFRESH force/fast/complete  /*刷新模式*/ON demand/commit/*按照指定方式刷新*/START WITH to_date('24-11-2005 18:00:10', 'dd-mm-yyyy hh24:mi:ss') /*第一次刷新時間*/NEXT TRUNC(SYSDATE+1)+18/24/*刷新時間間隔*/WITHprimarykey/rowidASSELECT
複製代碼


創建方式(Build Methods): 包括BUILD IMMEDIATE和BUILD DEFERRED兩種。BUILD IMMEDIATE是在創建物化視圖的時候就生成數據,而BUILD DEFERRED則在創建時不生成數據,以後根據需要在生成數據。默認爲BUILD IMMEDIATE。

查詢重寫(Query Rewrite): 包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出創建的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的基表進行查詢時,Oracle會自動判斷能否通過查詢物化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的物化視圖中讀取數據。默認爲DISABLE QUERY REWRITE。

刷新(Refresh): 指當基表發生了DML操作後,物化視圖何時採用哪種方式和基表進行同步。
--刷新的模式有兩種:ON DEMAND和ON COMMIT。
1)ON DEMAND(默認)指物化視圖在用戶需要的時候進行刷新,可以手工通過DBMS_MVIEW.REFRESH START WITH NEXT等方法來進行刷新,也可以通過JOB定時進行刷新。
2)ON COMMIT指出物化視圖在對基表的DML操作提交的同時進行刷新。
--刷新的方法有四種:FAST、COMPLETE、FORCE和NEVER。
1)FAST刷新採用增量刷新,只刷新自上次刷新以後進行的修改,需要建立primary key或者rowid類型的物化視圖日誌。
2)COMPLETE刷新對整個物化視圖進行完全的刷新(先truncate)。
3)FORCE(默認),在刷新時會判斷是否可以進行快速刷新,如果可以則採用FAST方式,否則採用COMPLETE的方式。
4)NEVER指物化視圖不進行任何刷新。

刷新例子:

複製代碼
SQL>create materialized view mv_name refresh force on demand start with sysdate next sysdate+1;/*創建定時刷新的物化視圖(指定物化視圖每天刷新一次)*/SQL>create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');/*指定具體刷新時間(如每天晚上10:00定時刷新一次)*/SQL>execute dbms_mview.refresh(‘EMP_BY_DISTRICT’);  /*刷新指定的物化視圖*/SQL>execute dbms_mview.refresh_defresh_dependent(‘EMPLOYEE’);  /*刷新利用了該表的所有物化視圖*/SQL>execute dbms_mview.refresh_all_mviews;  /*刷新該模式中,自上次刷新以來,未得到刷新的所有物化視圖*/
複製代碼


其他一些物化視圖高級用法(待續):
基於物理表的物化視圖:
   可以指明ON PREBUILD TABLE語句將物化視圖建立在一個已經存在的表上。這種情況下,物化視圖和表必須同名。當刪除物化視圖時,不會刪除同名的表。這種物化視圖的查詢重寫要求參數QUERY_REWRITE_INTEGRITY必須設置爲trusted或者stale_tolerated。
包含聚集的物化視圖;
只包含連接的物化視圖;
嵌套物化視圖。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章