要说物化视图,我觉得的先从视图说起。视图就是存储在Oracle中的一条查询语句,可以出看作是虚拟的表,不占用存储空间。访问视图时,Oracle运行这些查询语句,减少了解析的过程,特别是对与复杂的应用。但每次访问都要进行一次查询,特别是对于多重的连接和分组,每次执行都会花费很长时间。那么可不可以有一种方法可以既保留视图无需解析SQL的优点,有不用每次都重复查询增加系统性能负担呢?这就是物化视图啦。
物化视图是一类特殊的视图,Oracle为他分配了物理存储空间。这样可以在访问时直接取用,避免了每次访问都重新查询带来的性能开销。但这里有又另外一个问题——如何保证物化视图同基表的数据一致性。答案是物化视图的Refresh Option控制了物化视图的刷新模式和类型。
首先看刷新模式(refresh mode):ON COMMIT & ON DEMAND. ON COMMIT是在基表事务提交时自动刷新物化视图,ON DEMAND则需要手动调用DBMS_MVIEW.REFRESH过程进行刷新。
刷新类型(refresh type):COMPLETE, FAST, FORCE, NEVER。其中FORCE为默认选型。
COMPLETE:就是重新执行定义视图的SQL语句,等同于重新建立该物化视图。(在我看来这失去了建立物化视图的意义,用View就好啦,也许是将查询时的性能负担换到了刷新时,不过物化视图的刷新有更好的类型选择)。
FAST:Oracle使用物化视图日志(materialized view log,基于物化视图的表,以计算物化视图数据的变化)进行增量的刷新。
FORCE:Oracle将首先尝试使用FAST方式,如果不能刷新则使用COMPLETE。
NEVER:物化视图将不被刷新(非同步的数据又有什么意义),因此不是一个可行的选项。
说完了了物化视图本身的属性,接下来讲讲他的用途——查询重写(Query Rewrite)『书上说:The automatic query rewrite optimization technique is at the heart of materialized view usage.』。
查询重写重写是一种优化技术,将一个对表的查询重新导向到对应的物化视图。就比如Oracle在后台将select * from a where ... 重写为select * from a_mv。当然这个过程由CBO(Cost-based Optimizer,基于成本的优化器)自动判断使用并完成的,对用户是透明的。
HowTo: How to take advanteg of query rewrite?
1.初始化参数QUERY_REWRITE_ENABLED=FALSE|TRUE决定了Oracle是否重写查询,默认FALSE不重写,设置为TRUE则会在整个数据库中启用查询重写。当设置Oracle启用查询重写后,Oracle会默认使用物化视图中的最新数据(refresh data)。
2. 在创建物化视图时指明ENABLE QUERY REWRITE,已告知优化器对刚刚创建的物化视图自动而透明的进行查询重写。
Question:QUERY_REWRITE_INTEGRITY=
ENFORCED|TRUSTED|STALE_TOLERATED的用途
这个参数没太读明白,先留下来吧。
最后说创建物化视图,本身不难,不过有两个前置条件:
1. 授权:cteate any table, select any table, create materialized view, query rewrite
2. 建立物化视图日志:要对物化视图涉及的每一张基表建立一个日志(用于Fast刷新方式)
create materialized view log on
base_table_name.
3. 创建物化视图
create materialized view a_mv
build immediate|deferred
refresh fast on commit
enable query rewrite
as
select ....
写完这么多,有一个感想,在功能具备的条件下,Oracle提过更多的工具以提高查询的效率,这是否可以成为学习Oracle某些新对象(特性)的一个观点,技术解放人。
:End
上次留了个尾巴,今天查了文档,把它解决了。
QUERY_REWRITE_INTEGRITY参数决定了Oracle执行查询重写的程度。
ENFORCED:default,Oracle执行并确保一致性和完整性,只有ENABLED VALIDATED的主键或唯一键相关的查询才能被重写。
TRUSTED:允许声明但不强制的关系(ENABLE INVALIDATE)使用查询重写。
STALE_TOLERATED:允许使用非强制关系(DISABLE),此时物化视图即使与基表不一致时也可用于查询重写
:End
Query_rewrite_Integrity.jpg
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21402791/viewspace-622862/
,如需转载,请注明出处,否则将追究法律责任。