更新時間:2021年08月20日16時10分 來源:傳智教育 瀏覽次數(shù):
加QQ:435946716獲取Orcale視頻全套【筆記+教程】
視圖是一個虛擬表(也可以認為是一條語句),基于它創(chuàng)建時指定的查詢語句返回的結果集。每次訪問它都會導致這個查詢語句被執(zhí)行一次。為了避免每次訪問都執(zhí)行這個查詢,可以將這個查詢結果集存儲到一個物化視圖(也叫實體化視圖)。
物化視圖與普通的視圖相比的區(qū)別是物化視圖是建立的副本,它類似于一張表,需要占用存儲空間。而對一個物化視圖查詢的執(zhí)行效率與查詢一個表是一樣的。
CREATE METERIALIZED VIEW view_name [BUILD IMMEDIATE | BUILD DEFERRED ] REFRESH [FAST|COMPLETE|FORCE] [ ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT (next_time) ] AS subquery
BUILD IMMEDIATE 是在創(chuàng)建物化視圖的時候就生成數(shù)據(jù)
BUILD DEFERRED 則在創(chuàng)建時不生成數(shù)據(jù),以后根據(jù)需要再生成數(shù)據(jù)。
默認為 BUILD IMMEDIATE。
刷新(REFRESH):指當基表發(fā)生了 DML 操作后,物化視圖何時采用哪種方式和基表進行同步。
REFRESH 后跟著指定的刷新方法有三種:FAST、COMPLETE、FORCE。FAST刷新采用增量刷新,只刷新自上次刷新以后進行的修改。COMPLETE刷新對整個物化視圖進行完全的刷新。如果選擇 FORCE 方式,則 Oracle 在刷新時會去判斷是否可以進行快速刷新,如果可以則采用FAST方式,否則采用COMPLETE的方式。FORCE 是默認的方式。
刷新的模式有兩種:ON DEMAND 和 ON COMMIT。ON DEMAND 指需要手動刷新物化視圖(默認)。ON COMMIT 指在基表發(fā)生COMMIT操作時自動刷新。
3.1 創(chuàng)建手動刷新的物化視圖
需求:查詢地址 ID,地址名稱和所屬區(qū)域名稱, 結果如下:
語句:
create materialized view mv_address as select ad.id,ad.name adname,ar.name ar_name from t_address ad,t_area ar where ad.areaid=ar.id
執(zhí)行上邊的語句后查詢
select * from mv_address;
查詢結果如下:
這時,我們向地址表(T_ADDRESS)中插入一條新記錄,
insert into t_address values(8,'宏福苑小區(qū)',1,1);
再次執(zhí)行上邊的語句進行查詢,會發(fā)現(xiàn)新插入的語句并沒有出現(xiàn)在物化視圖中。
我們需要通過下面的語句(PL/SQL),手動刷新物化視圖:
begin DBMS_MVIEW.refresh('MV_ADDRESS','C'); end;
或者通過下面的命令手動刷新物化視圖:
EXEC DBMS_MVIEW.refresh('MV_ADDRESS','C'); 注意:此語句需要在命令窗口中執(zhí)行。
執(zhí)行此命令后再次查詢物化視圖,就可以查詢到最新的數(shù)據(jù)了。
DBMS_MVIEW.refresh 實際上是系統(tǒng)內置的存儲過程,關于存儲過程我們還會介紹。
3.2 創(chuàng)建自動刷新的物化視圖,和上例一樣的結果集
語句如下:
create materialized view mv_address2 refresh on commit as select ad.id,ad.name adname,ar.name ar_name from t_address ad,t_area ar where ad.areaid=ar.id
創(chuàng)建此物化視圖后,當 T_ADDRESS 表發(fā)生變化時,MV_ADDRESS2 自動跟著改變。
3.3 創(chuàng)建時不生成數(shù)據(jù)的物化視圖
create materialized view mv_address3 build deferred refresh on commit as select ad.id,ad.name adname,ar.name ar_name from t_address ad,t_area ar where ad.areaid=ar.id;
創(chuàng)建后執(zhí)行下列語句查詢物化視圖
select * from mv_address3
查詢結果:
執(zhí)行下列語句生成數(shù)據(jù)
begin DBMS_MVIEW.refresh('MV_ADDRESS3','C'); end;
再次查詢,得到結果:
由于我們創(chuàng)建時指定的 on commit ,所以在修改數(shù)據(jù)后能立刻看到最新數(shù)據(jù),無須再次執(zhí)行 refresh
3.4 創(chuàng)建增量刷新的物化視圖
如果創(chuàng)建增量刷新的物化視圖,必須首先創(chuàng)建物化視圖日志
create materialized view log on t_address with rowid; create materialized view log on t_area with rowid
創(chuàng)建的物化視圖日志名稱為 MLOG$_表名稱
創(chuàng)建物化視圖
create materialized view mv_address4 refresh fast as select ad.rowid adrowid ,ar.rowid arrowid, ad.id,ad.name adname,ar.name ar_name from t_address ad,t_area ar where ad.areaid=ar.id;
注意:創(chuàng)建增量刷新的物化視圖,必須:
(1)創(chuàng)建物化視圖中涉及表的物化視圖日志。
(2)在查詢語句中,必須包含所有表的 rowid ( 以 rowid 方式建立物化視圖日志 )
當我們向地址表插入數(shù)據(jù)后,物化視圖日志的內容:
SNAPTIME$$:用于表示刷新時間。
DMLTYPE$$:用于表示 DML 操作類型,I 表示 INSERT,D 表示 DELETE,U表示 UPDATE。
表示舊值,U 表示 UPDATE 操作。
CHANGE_VECTOR$$:表示修改矢量,用來表示被修改的是哪個或哪幾個字段。
此列是 RAW 類型,其實 Oracle 采用的方式就是用每個 BIT 位去映射一個列。
插入操作顯示為:FE, 刪除顯示為:OO 更新操作則根據(jù)更新字段的位置而顯示不同的值。
當我們手動刷新物化視圖后,物化視圖日志被清空,物化視圖更新。
begin DBMS_MVIEW.refresh('MV_ADDRESS4','C'); end;
猜你喜歡: