ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 物化视图-学习篇

物化视图-学习篇

原创 Linux操作系统 作者:lingsam 时间:2013-04-08 22:58:08 0 删除 编辑
语法:
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博客 ” ,链接:https://blog.itpub.net/26764468/viewspace-757997/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 别离
请登录后发表评论 登录
全部评论

注册时间:2012-03-06

  • 博文量
    11
  • 访问量
    64878