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/