久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

12c物化視圖中什么是快速刷新

140次閱讀
沒有評論

共計 3390 個字符,預計需要花費 9 分鐘才能閱讀完成。

這篇文章主要介紹了 12c 物化視圖中什么是快速刷新,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

實驗之前先明確兩個定義:

主表:SH.costs,example 中的示例表

基表:SH.mv_costs,保存查詢結果集的實體表,也就是“模擬物化視圖”的真正保存數據的地方。

增量基表:記錄主表數據變化的表

什么是快速刷新?

快速刷新就是增量刷新,只應用主表產生的 insert、update、delete 操作。就像是 RMAN 中的增量備份,只備 0 級增量備份后的變化。

快速刷新的實現需要在主表上創建一個日志文件,該文件記錄了主表被修改的記錄。其實該文件也是一張基表,保存了主表的增量變化。增量基表記錄變化時依賴于主表的主鍵或者是 rowid。當觸發快速刷新后,增量基表中的變化數據會更新到物化視圖的基表中,然后將自己清空等待主表的變化。從另一個角度來看增量基表采用了緩存的原理,將數據變化收集起來,分批次加載到物化視圖基表,減少完全刷新的消耗。

下面通過一個實驗來看看快速刷新的過程

[oracle@snow ~]$ sqlplus / as sysdba

SYS@cdb conn sh/sh@pdb1

目前 COSTS 表中沒有主鍵,在創建 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 的方式創建物化視圖日志

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. 創建快速刷新的物化視圖

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

錯誤提示剛剛創建的物化視圖日志不符合要求。將其刪除,調整后重新創建。

SH@pdb1 drop materialized view log on costs;

Materialized view log dropped.

重新創建物化視圖日志,并且添加 Including new values 字句。

其中 sequence 是通過 promo_id 和 unit_cost 記錄 DML 操作的次序,當刷新時按照這個次序在基表上執行

SH@pdb1

create materialized view log on costs with rowid,

sequence(promo_id,unit_cost) including new values;

Materialized view log created.

讓我們看看物化視圖日志創建成功后會包含兩個對象,其中 MLOG$_COSTS 是增量基表。當主表產生數據變化時,隱含的 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

修改后的物化視圖日志滿足要求,再次創建物化視圖成功。

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)是數據的邏輯容器;MVF_COSTS(TABLE)是保存查詢結果的基表;MLOG$_COSTS 是增量基表保存主表 COSTS 的數據變化;I_SNAP$_MVF_COSTS 是 MV 的唯一索引,它是 Oracle 為了提高刷新性能二自動創建的;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@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

手工執行一次快速刷新

SH@pdb1 exec dbms_mview.refresh(MVF_COSTS , F

PL/SQL procedure successfully completed.

快速刷新執行完畢,增量基表中的數據不再有用。

SH@pdb1 select count(*) from MLOG$_COSTS;

COUNT(*)

———-

0

下面是刷新前后物化視圖的數據變化

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

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“12c 物化視圖中什么是快速刷新”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-17發表,共計3390字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 临夏县| 尉犁县| 阳城县| 嫩江县| 怀化市| 城步| 贵德县| 芮城县| 宁城县| 彰武县| 瓦房店市| 江安县| 宜章县| 松阳县| 武安市| 鄯善县| 鲁甸县| 岢岚县| 海口市| 渭南市| 津南区| 三门峡市| 乌兰县| 兴国县| 资兴市| 津市市| 江孜县| 昌吉市| 玛曲县| 呼图壁县| 沁源县| 乌鲁木齐市| 宁武县| 泾川县| 织金县| 武定县| 黄石市| 黄大仙区| 噶尔县| 铜陵市| 苗栗市|