區別
物化視圖和
視圖類似,反映的是某個查詢的結果,但是和視圖僅保存SQL定義不同,物化視圖本身會存儲數據,因此是物化了的視圖。
分類
用於數據複製的物化視圖
物化視圖的一個主要功能就是用於數據的複製,Oracle推出的高級複製功能分為兩個部分,多主複製和物化視圖複製。而物化視圖複製就是利用了物化視圖的功能。
物化視圖複製包含唯讀物化視圖複製、可更新物化視圖複製和可寫物化視圖複製。
1、唯讀物化視圖複製建立的是源資料庫的唯讀環境。
2、可更新物化視圖複製建立基於物化視圖雙向複製環境。
3、可寫物化視圖複製在物化視圖建立的時候使用了FOR UPDATE,但是沒有像可更新物化視圖那樣添加到物化視圖組中,因此本地物化視圖可以修改,但是修改無法傳送到源資料庫中,因為修改在物化視圖刷新後會丟失,這種類型的物化視圖複製很少使用。
用於預計算的物化視圖
這種類型的物化視圖一般用於數據倉庫系統。主要用於預先計算並保存表連線或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。這種物化視圖還經常使用查詢重寫(query rewrite)機制,這樣不需要修改原有的查詢語句,Oracle會自動選擇合適的物化視圖進行查詢,完全對套用透明。
這種物化視圖可以分為以下三種類型:包含聚集的物化視圖;只包含連線的物化視圖;嵌套物化視圖。三種物化視圖的快速刷新的限制條件有很大區別,而對於其他方面則區別不大。
創建物化視圖
1、創建方式(Build Methods):Build Immediate 和Build Deferred兩種。Build Immediate 是在創建物化視圖的時候就生成數據,而Build Deferred則在創建時不生成數據,以後根據需要再生成數據。默認為Build Immediate 。
2、查詢重寫(Query Rewrite):Enable Query Rewrite和Disable Query Rewrite兩種。分別指出創建的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的
基表進行查詢時,Oracle會自動判斷能否通過查詢物化視圖來得到結果,如果可以,則避免了聚集或連線操作,而直接從已經計算好的物化視圖中讀取數據。默認為Disable Query Rewrite。
3、刷新(Refresh):指當基表發生了DML操作後,物化視圖何時採用哪種方式和基表進行同步。刷新的模式有兩種:On Demand和On Commit。On Demand指物化視圖在用戶需要的時候進行刷新,可以手工通過DBMS_MVIEW.REFRESH等方法來進行刷新,也可以通過JOB定時進行刷新。On Commit指物化視圖在對
基表的DML操作提交的同時進行刷新。刷新的方法有四種:Fast 、Complete 、Force和Never。Fast 刷新採用增量刷新,只刷新自上次刷新以後進行的修改。Complete 刷新對整個物化視圖進行完全的刷新。如果選擇Force方式,則Oracle在刷新時會去判斷是否可以進行快速刷新,如果可以則採用FAST方式,否則採用Complete 的方式。Never指物化視圖不進行任何刷新。默認值是Force On Demand。
在建立物化視圖的時候可以指定Order by 語句,使生成的數據按照一定的順序進行保存。不過這個語句不會寫入物化視圖的定義中,而且對以後的刷新也無效。
4、物化視圖日誌:如果需要進行快速刷新,則需要建立物化視圖日誌。物化視圖日誌根據不同物化視圖的快速刷新的需要,可以建立為RowID或Primary Key類型的。還可以選擇是否包括Sequence、Including New Values以及指定列的列表。
可以指明On PreBuild Table語句將物化視圖建立在一個已經存在的表上。這種情況下,物化視圖和表必須同名。當刪除物化視圖時,不會刪除同名的表。這種物化視圖的查詢重寫要求參數Query_Rewrite_integerity必須設定為 trusted或者stale_tolerated。
5、物化視圖可以進行分區。而且基於分區的物化視圖可以支持分區變化跟蹤(PCT)。具有這種特性的物化視圖,當
基表進行了分區維護操作後,仍然可以進行快速刷新操作。對於聚集物化視圖,可以在Group by 列表中使用Cube或RollUp,來建立不同等級的聚集物化視圖。
示例1:
create materialized view MV_ DOP_TEST
refresh force on demand
as
select dsso.dop_id,
soo.work_center_no,
soo.operation_description
from SHOP_ORDER_OPERATION SOO,
DOP_SUPPLY_SHOP_ORD DSSO
where soo.order_no=dsso.order_no
and soo.release_no=dsso.release_no
and soo.sequence_no=dsso.sequence_no;
---其中創建與刪除物化視圖與其表或視圖DDL一樣:
DROP materialized view log on materialized_view_log_name ;
創建物化視圖時創建存儲的日誌空間(存儲物化視圖的對象的改變信息)
CREATE MATERIALIZED VIEW LOG ON Dop_Supply_Shop_Ord_Tab --(
基表名)
tablespace ifsapp_DATA --日誌保存在特定的
表空間WITH ROWID ;
drop materialized view MV_materialized_view_name ;
示例2:
create materialized view MV_DOP_TEST
TABLESPACE ifsapp_DATA --保存
表空間BUILD DEFERRED --延遲刷新不立即刷新,此建立初始視圖一般沒數據
refresh force --如果可以快速刷新則進行快速刷新,否則完全刷新
with rowid --根據rowid刷新(默認是主鍵)
On demand --按照指定方式刷新
start with to_date('2008-12-11 13:20:51','YYYY-MM-DD HH24:MI:SS') next sysdate+1/48
as
select dsso.dop_id,
soo.work_center_no,
soo.operation_description
from SHOP_ORDER_OPERATION SOO,
DOP_SUPPLY_SHOP_ORD DSSO
where soo.order_no=dsso.order_no
and soo.release_no=dsso.release_no
and soo.sequence_no=dsso.sequence_no
刪除物化視圖
刪除物化視圖有兩種順序,一是先刪除物化視圖再刪除日誌;二是先刪除日誌再刪除物化視圖。
如果原數據表只被一個物化視圖引用,那么可以採用先刪除日誌,再刪除物化視圖,這樣刪除的速度較快。
drop materialized view log on test_table;
drop materialized view mv_test_table;
如果日誌上建立了多個物化視圖,那么致刪除物化視圖即可,因為刪除日誌後,其他引用該日誌的物化視圖將無法刷新。