您好,登錄后才能下訂單哦!
這篇文章主要介紹了12c物化視圖中什么是快速刷新,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
實驗之前先明確兩個定義:
主表:SH.costs ,example中的示例表
基表:SH.mv_costs ,保存查詢結(jié)果集的實體表,也就是“模擬物化視圖”的真正保存數(shù)據(jù)的地方。
增量基表:記錄主表數(shù)據(jù)變化的表
什么是快速刷新?
快速刷新就是增量刷新,只應用主表產(chǎn)生的insert、update、delete操作。就像是RMAN中的增量備份,只備0級增量備份后的變化。
快速刷新的實現(xiàn)需要在主表上創(chuàng)建一個日志文件,該文件記錄了主表被修改的記錄。其實該文件也是一張基表,保存了主表的增量變化。增量基表記錄變化時依賴于主表的主鍵或者是rowid。當觸發(fā)快速刷新后,增量基表中的變化數(shù)據(jù)會更新到物化視圖的基表中,然后將自己清空等待主表的變化。從另一個角度來看增量基表采用了緩存的原理,將數(shù)據(jù)變化收集起來,分批次加載到物化視圖基表,減少完全刷新的消耗。
下面通過一個實驗來看看快速刷新的過程
[oracle@snow ~]$ sqlplus / as sysdba
SYS@cdb > conn sh/sh@pdb1
目前COSTS表中沒有主鍵,在創(chuàng)建MV日志時只能使用ROWID
SH@pdb1 > col owner for a20
SH@pdb1 > col constraint_name for a20
SH@pdb1 > select owner,constraint_name,constraint_type from dba_constraints where table_name='COSTS';
OWNER CONSTRAINT_NAME C
-------------------- -------------------- -
SH SYS_C009967 C
SH SYS_C009966 C
SH SYS_C009965 C
SH SYS_C009964 C
SH SYS_C009963 C
SH SYS_C009962 C
SH COSTS_CHANNEL_FK R
SH COSTS_TIME_FK R
SH COSTS_PRODUCT_FK R
SH COSTS_PROMO_FK R
1. 采用rowid的方式創(chuàng)建物化視圖日志
SH@pdb1 > create materialized view log on costs with rowid;
Materialized view log created.
如果有主鍵的話可以使用
SH@pdb1 > create materialized view log on costs with primary key;
2. 創(chuàng)建快速刷新的物化視圖
SH@pdb1 > create materialized view mvf_costs
2 segment creation immediate
3 refresh with rowid fast on demand
4 as select promo_id,sum(unit_cost) cost from costs group by promo_id;
as select promo_id,sum(unit_cost) cost from costs group by promo_id
*
ERROR at line 4:
ORA-32401: materialized view log on "SH"."COSTS" does not have new values
錯誤提示剛剛創(chuàng)建的物化視圖日志不符合要求。將其刪除,調(diào)整后重新創(chuàng)建。
SH@pdb1 > drop materialized view log on costs;
Materialized view log dropped.
重新創(chuàng)建物化視圖日志,并且添加Including new values字句。
其中sequence是通過promo_id和unit_cost記錄DML操作的次序,當刷新時按照這個次序在基表上執(zhí)行
SH@pdb1 >
create materialized view log on costs with rowid,
sequence(promo_id,unit_cost) including new values;
Materialized view log created.
讓我們看看物化視圖日志創(chuàng)建成功后會包含兩個對象,其中MLOG$_COSTS是增量基表。當主表產(chǎn)生數(shù)據(jù)變化時,隱含的trigger會將其寫入該表中。
SH@pdb1 > col object_name for a30
SH@pdb1 > select object_name,object_type from user_objects where object_name like '%_COSTS%';
OBJECT_NAME OBJECT_TYPE
------------------------------ -----------------------
I_MLOG$_COSTS INDEX
MLOG$_COSTS TABLE
修改后的物化視圖日志滿足要求,再次創(chuàng)建物化視圖成功。
SH@pdb1 >
create materialized view mvf_costs
segment creation immediate
refresh fast with rowid on demand
as select promo_id,sum(unit_cost) cost from costs group by promo_id;
下面看看物化視圖mvf_costs的家族成員吧。MVF_COSTS(MATERIALIZED VIEW)是數(shù)據(jù)的邏輯容器;MVF_COSTS(TABLE)是保存查詢結(jié)果的基表;MLOG$_COSTS是增量基表保存主表COSTS的數(shù)據(jù)變化;I_SNAP$_MVF_COSTS是MV的唯一索引,它是Oracle為了提高刷新性能二自動創(chuàng)建的;I_MLOG$_COSTS是增量基表的索引。
SH@pdb1 > col object_name for a30
SH@pdb1 > select object_name,object_type from user_objects where object_name like '%_COSTS%';
OBJECT_NAME OBJECT_TYPE
------------------------------ -----------------------
I_MLOG$_COSTS INDEX
I_SNAP$_MVF_COSTS INDEX
MLOG$_COSTS TABLE
MVF_COSTS TABLE
MVF_COSTS MATERIALIZED VIEW
下面開始測試一下刷新功能
向主表costs添加1000條數(shù)據(jù)
SH@pdb1 > insert into costs select * from costs where rownum < 1001;
1000 rows created.
SH@pdb1 > commit;
Commit complete.
檢查增量基表會看到新增了1000條記錄
SH@pdb1 > select count(*) from MLOG$_COSTS;
COUNT(*)
----------
1000
手工執(zhí)行一次快速刷新
SH@pdb1 > exec dbms_mview.refresh('MVF_COSTS','F');
PL/SQL procedure successfully completed.
快速刷新執(zhí)行完畢,增量基表中的數(shù)據(jù)不再有用。
SH@pdb1 > select count(*) from MLOG$_COSTS;
COUNT(*)
----------
0
下面是刷新前后物化視圖的數(shù)據(jù)變化
SH@pdb1 > select * from mvf_costs;
PROMO_ID COST
---------- ----------
999 9173508.88
350 242949.08
351 258268
SH@pdb1 > select * from mvf_costs;
PROMO_ID COST
---------- ----------
999 9313900.88
350 242949.08
351 258268
感謝你能夠認真閱讀完這篇文章,希望小編分享的“12c物化視圖中什么是快速刷新”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。