日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解

發布時間:2024/10/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前一篇博客用一個簡單的示例描述了完全刷新的物化視圖。完全刷新的物化視圖每次刷新都需要對保存數據的基表執行delete操作,在將新的結果集insert到基表。為了減少這個開銷,為了減少這個開銷Oracle為我們提供了快速刷新物化視圖。

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

主表: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$_COSTSTABLE

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

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

上述實驗對于剛剛接觸物化視圖的同學來說非常容易理解。我也從中收益過,特此分享一下。

總結

以上是生活随笔為你收集整理的oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。