Oracle12c 中如何理解完全刷新的物化视图工作原理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
什么是物化视图?
物化视图是用于复制数据和提高查询操作性能的数据库对象。
引用Darl Kuhn的一句话来回答就是:“定期清空和加载查询结果的表”
我们可以通过一个小例子来模拟最简单的完全刷新物化视图的工作过程
实验之前先明确两个定义:
主表:SH.costs ,example中的示例表
基表:SH.mv_costs ,保存查询结果集的实体表,也就是“模拟物化视图”的真正保存数据的地方。
实验一,模拟完全刷新物化视图
1. 主表为SH.costs
SH@pdb1 > select * from costs where rownum<10;
PROD_ID TIME_ID PROMO_ID CHANNEL_ID UNIT_COST UNIT_PRICE
---------- --------- ---------- ---------- ---------- ----------
14 17-JAN-98 999 3 890.98 1112.87
14 24-JAN-98 999 2 886.45 1108.99
14 03-MAR-98 999 2 904.18 1176.23
14 10-MAR-98 999 3 892.72 1159.99
14 14-MAR-98 999 4 863.64 1176.23
15 02-JAN-98 999 3 875.22 1013.99
15 17-JAN-98 999 4 846.71 999.99
15 19-JAN-98 999 4 846.71 999.99
15 02-FEB-98 999 4 863.64 1013.99
2. 假设主表的常用查询如下
SH@pdb1 > select promo_id,sum(unit_cost) cost from costs group by promo_id;
PROMO_ID COST
---------- ----------
999 9168179.93
350 242949.08
351 258268
3. 使用CTAS方式创建一个表来保存常用查询的结果集,此刻它相当于物化视图的基表。
SH@pdb1 > create table mv_costs as select promo_id,sum(unit_cost) cost from costs group by promo_id;
4. 物化视图的基表执行完全刷新的过程模拟如下。首先删除基表中所有数据,然后再将源表的查询结果集插入到基表中。
SH@pdb1 > delete mv_costs;
SH@pdb1 > commit;
SH@pdb1 > insert into mv_costs select promo_id,sum(unit_cost) cost from costs group by promo_id;
SH@pdb1 > commit;
5. 查询物化视图基表的数据。
SH@pdb1 > select * from mv_costs;
PROMO_ID COST
---------- ----------
999 9168179.93
350 242949.08
351 258268
实验二, 创建完全刷新的物化视图
模拟结束,接下来创建一个真正的物化视图,跟上面模拟示例功能一样的完全刷新的物化视图。
SH@pdb1 >
create materialized view mv_costs_1
segment creation immediate
refresh
complete
on demand
as select promo_id,sum(unit_cost) cost from costs group by promo_id;
通过下面的sql语句可以看到我们创建的物化视图是由视图、基表两部分组成。基表是真正存储查询结果集的地方。
SH@pdb1 > col object_name for a20
SH@pdb1 > select object_name,object_type from user_objects where object_name like 'MV_COSTS_1' order by object_name;
OBJECT_NAME OBJECT_TYPE
-------------------- -----------------------
MV_COSTS_1 TABLE
MV_COSTS_1 MATERIALIZED VIEW
手工执行完全刷新,该命令执行效果和模拟演示中delete mv_costs, insert into mv_costs select ...是一样的。
SH@pdb1 > exec dbms_mview.refresh('MV_COSTS_1','C');
关于Oracle12c 中如何理解完全刷新的物化视图工作原理问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。