物化视图-学习篇

语法:
create materialized view 物化视图名称 as 视图定义 
解释:
预先计算并保存表连接或汇聚等耗时较多的操作的结果;当查询时,可以避免执行这些耗时的操作,从而快速达到的查询结果。比较类似于索引。使用物化视图的作用就是为了提高查询效率。
物化视图占用一定的存储空间,且当基表发生变化时,物化视图也应刷新。
物化视图的优点比较:
(1)无物化视图时:
SQL>select object_type,count(1) from dba_objects group by object_type;
(2)有物化视图时:
SQL>create materialized view mv_object_count as select object_type,count(1) from dba_objects group by object_type;
SQL>select * form. mv_object_count;
可以通过比较两者执行计划,查看两者的查询效率。

数据字典中获取物化视图信息:
user_mviews
查询物化视图表
SQL>select object_name, object_type, status from user_objects where object_name='MV_OBJECT_COUNT';
OBJECT_NAME         OBJECT_TYPE         STATUS  
---------------     -----------         ------  
 
MV_OBJECT_COUNT     TABLE                VALID  
MV_OBJECT_COUNT     MATERIALIZED VIEW    VALID


在查询结果中含有两条记录,其中一条标识了物化视图本身,而另一条则标识了物化视图的附属数据表。物化视图创建时,会将查询定义所获得的数据加载到附属数据表中。而当查询物化视图时,查询的对象实际是物化视图的附属表。

创建物化视图时,会先创建表,再将数据导入。该过程将消耗较大的资源,甚至会影响客户端的相应速度。此时,可以考虑在创建时使用延迟载入策略。
SQL> drop materialized view mv_object_count;
SQL> create materialized view mv_object_count build deferred as  
 2  select object_type, count(*) object_count  
 3  from tmp_user_objects  
 4  group by object_type;  
SQL>select * from mv_object_count; 反馈结果无数据。
刷新:
手动刷新:
SQL>exec dbms_mview.refresh('mv_object_count');  
SQL>select * from mv_object_count;  有结果反馈
基表提交时,自动刷新:
SQL> alter materialized view mv_object_count refresh on commit;  
此时更改基表后,如向基表中插入记录数并提交,则数据自动同步。缺点:当数据频繁更新时,将给数据库性能带来极大的负载。所以这种策略仅仅适用于那些读取频繁,而更新较少的场景下。
查询重写:

查询重写的对象为普通查询语句。在查询语句中,Oracle总是搜寻from子句中所指定的数据源(表或视图)。查询重写是指,当进行查询时,Oracle改写查询语句,搜寻其他数据源,以在保证相同结果的情况下提高执行效率。而这个新的数据源,则往往是物化视图。

当然,使用查询重写,首先要启用物化视图的查询重写功能。例如,对于视图mv_object_count,启用查询重写功能的SQL语句如下所示。

SQL> alter materialized view mv_object_count enable query rewrite; 

SQL>select object_name, object_type, status from user_objects where object_name='MV_OBJECT_COUNT';


可以看出,虽然在整个查询语句中,并未使用物化视图mv_object_count。但由于查询重写功能的存在,Oracle自动将数据查询的数据源指向了mv_object_count

SQL> alter materialized view mv_object_count disable query rewrite;

SQL>select object_name, object_type, status from user_objects where object_name='MV_OBJECT_COUNT';

 在执行计划中可以看出,Oracle使用了from子句指定的查询对象--tmp_user_objects进行查询。查询语句的花费基数为4。

SQL> alter materialized view mv_object_count enable query rewrite; 

select count(*) from user_objects;

Oracle在执行过程中,会发现利用物化视图mv_object_count可以获得相同的查询结果,并且更有效率,因此便使用了查询重写。这一切换过程是Oracle自动完成的,用户无须手动控制。





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

转载于:http://blog.itpub.net/26764468/viewspace-757997/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值