我的编程空间,编程开发者的网络收藏夹
学习永远不晚

12c物化视图中什么是快速刷新

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

12c物化视图中什么是快速刷新

这篇文章主要介绍了12c物化视图中什么是快速刷新,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

实验之前先明确两个定义:

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

感谢你能够认真阅读完这篇文章,希望小编分享的“12c物化视图中什么是快速刷新”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

12c物化视图中什么是快速刷新

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue中data改变后让视图同步更新的原因是什么

这篇文章主要介绍了vue中data改变后让视图同步更新的原因是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原因我们都知道,在vue中改变数据后,视图并不是同步更新的。在
2023-06-14

编程热搜

目录