共计 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 行业资讯频道,更多相关知识等着你来学习!