ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Materialized View

Materialized View

原创 Linux操作系统 作者:yangjie_5211 时间:2009-12-18 14:28:58 0 删除 编辑
        要说物化视图,我觉得的先从视图说起。视图就是存储在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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 开篇
下一篇: 层次化查询
请登录后发表评论 登录
全部评论

注册时间:2009-12-18

  • 博文量
    12
  • 访问量
    11117