在只读或“精读”环境工作更好,不适用高端的联机处理系统,在并发事务不是很高的系统也可以使用
使用前提:
调整初始参数 query_rewrite_enabled,query_rewrite_integrity; 该参数可以动态调整,不需要重启
alter system set query_rewrite_enabled=true;
Trusted:总是相信相信数据库定义的constraints和relations,只要constraints和relations满足使用物化视图条件,就考虑使用物化视图来重写查询
Stale_tolerated:允许查询重写使用stale的物化视图,允许视图的刷新滞后
create materialized view mview_owner_sum
build immediate
refresh on commit
enable query rewrite
as
select count(*),owner from test
group by owner;
oracle在数据更新后有可能(refresh on commit)自动重写物化视图
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。默认为 refresh force on demand.
刷新的模式有两种:ON DEMAND:手动或定时刷新;ON COMMIT:事物提交时自动刷新。
刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。
对于已经创建好的物化视图,可以修改其刷新方式,比如把物化视图mv_name的刷新方式修改为每天晚上10点刷新一次:alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,’dd-mm-yyyy’),’ 22:00:00′),’dd-mm-yyyy hh24:mi:ss’)
但不是能对任意的物化视图进行同步,对单一表或者没有聚集的连接可以重写。
查询重写:
如果查询语句符合如下相关条件,oracle优化器会从物化视图中查询,也就是查询重写。
1、sql和定义视图的sql 完全匹配,可忽略空白字符大小以及其他格式
2、部分正文匹配
3、查询的数据可以从物化视图中提取出来
4、连接兼容
5、分组兼容
6、聚集兼容
(4、5、6的原则实际上就是做相关连接、分组、聚集相关数据全包含在物化视图中才能重写查询)
7、另外在不同的优化策略下,是否查询重写是不一样的。在默认choose模式数据量不大的情况基本不会查询重写。
根据上述原则,可通过如下的方法达到尽可能的查询重写,达到优化的目的:
1、 尽可能的增加物化视图对应的基本表的之间的约束关系,如主键、外键,等,
这样查询是如果对应数据可从物化视图中提取出来,系统会有可能改写查询,采用物化视图
2、可以通过dimension对象可以指定相关表、字段之间的关系
相关文章