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

什么是物化视图?
物化视图是用于复制数据和提高查询操作性能的数据库对象。
引用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博客 ” ,链接:http://blog.itpub.net/29047826/viewspace-1562838/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29047826/viewspace-1562838/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Oracle 12c中,可以使用内联视图来解决问题。通过将内联视图放在查询的FROM子句中,并使用INNER JOIN将其与其他表连接,可以确保首先评估内联视图。例如,可以使用以下查询来创建一个内联视图并将其与表b连接: select x from b inner join ( select only_rows_with_numeric_values as numeric_column from a where NOT REGEXP_LIKE (a.column, '\[^\[:digit:\]\]') ) c on c.numeric_column = b.numeric_column; 这样,内联视图中的查询将首先执行,并将结果与表b进行连接。这样可以确保在查询过程中首先评估内联视图。\[1\] #### 引用[.reference_title] - *1* [Oracle 12c内联视图评估](https://blog.csdn.net/weixin_36179933/article/details/116360190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [12c 物化视图 - 对快速刷新理解](https://blog.csdn.net/weixin_28716443/article/details/116289395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [oracle12c v$sql视图字段全解](https://blog.csdn.net/weixin_26804345/article/details/116522206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值