ITPub博客

首页 > 数据库 > Oracle > 12c 物化视图 - 理解完全刷新的物化视图工作原理

12c 物化视图 - 理解完全刷新的物化视图工作原理

原创 Oracle 作者:SnowDBA 时间:2015-04-10 21:26:31 0 删除 编辑
什么是物化视图?
物化视图是用于复制数据和提高查询操作性能的数据库对象。
引用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');

上述实验对于刚刚接触物化视图的同学来说非常容易理解。我也从中收益过,特此分享一下。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29047826/viewspace-1562838/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-06-21

  • 博文量
    223
  • 访问量
    1633587