美文网首页我爱编程
Oracle物化视图的用法与总结

Oracle物化视图的用法与总结

作者: Bobby0322 | 来源:发表于2017-08-26 09:38 被阅读1807次

    Oracle物化视图的用法与总结

    物化视图(material view)是什么?

    物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表
    物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
    如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
    对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。(这个是基于本地的基表或者视图的聚合)。
    物化视图,说白了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。当然要打开查询重写选项;

    简而言之,就是具有实体表的视图,而且这个视图还可以根据多种需求和策略进行刷新。此外还有一个非常重要的功能
    查询重写(query rewrite) .查询重写能够在某些时候提高你的查询速度。
    所谓查询重写,简而言之,就是oracle 的查询优化器发现有个物化视图的语法和你的SQL差不多,那么就会直接访问物化视图,而不是你原来查询中有关的源表。

    物化视图能干什么?

    或者说,你能拿物化视图做什么用。
    前文简单说了下,此处列出一些重要而想详细的功能:

    • 能够提高查询速度,这主要是因为物化视图存储了实际的数据,其次具有查询重写功能。最后,物化视图具有实体表,你也可以在上面建立索引,总之大体上当作一个表用就可以了。
    • 简化了开发任务,意思是开发的人员有的时候,无需直接关注部分sql的性能,而通过dba的努力,使用查询重写来完成性能的提升。
    • 减少了工作量,因为物化视图可以定义两种刷新方式:立即刷新,按需刷新。所谓按需刷新就是你自己手动刷新,或者是定时刷新;所谓立即刷新,即视图主表发生变化的时候,视图立即刷新内容。 你可以根据自己的设备情况,应用情况和需求来控制刷新的方式。
    • 刷新量的灵活限制,你可以快速是刷新(只刷新变化的),也可以全刷新。看你的需要。

    物化视图可以分为以下三种类型

    1. 包含聚集的物化视图;
    2. 只包含连接的物化视图;
    3. 嵌套物化视图。

    三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:

    • 创建方式(BuildMethods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。
      BUILD IMMEDIATE是在创建物化视图的时候就生成数据。
      BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE

    • 查询重写(QueryRewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。
      分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE

    • 刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新,即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。对基表,平常的COMMIT在0.01秒内可以完成,但在有了ON COMMIT视图后,居然要6秒。速度减低了很多倍。ON COMMIT视图对基表的影响可见一斑。

    物化视图,根据不同的着重点可以有不同的分类:

    1. 按刷新方式分:FAST/COMPLETE/FORCE
    2. 按刷新时间的不同:ON DEMAND/ON COMMIT
    3. 按是否可更新:UPDATABLE/READ ONLY
    4. 按是否支持查询重写:ENABLE QUERY REWRITE/DISABLEQUERY REWRITE

    默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND
    注意:设置REFRESH ON COMMIT的物化视图不能访问远端对象。
    在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。

    物化视图有三种刷新方式:COMPLETE、FAST和 FORCE

    • 完全刷新(COMPLETE)会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。
    • 快速刷新(FAST)采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FAST必须创建基于主表的视图日志。对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。
    • 采用FORCE方式,Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle通过一个物化视图日志还可以支持多个物化视图的快速刷新。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

    物化视图操作示例

    
    
    
    -- 物化视图操作示例
    
    -- 删除物化视图
    DROP MATERIALIZED VIEW V_RPT_ACT_ACTION;
    
    
    -- 创建物化视图
    
    /**
     1.创建方式(BuildMethods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。
     BUILD IMMEDIATE是在创建物化视图的时候就生成数据。
     BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。
     
     2. 查询重写(QueryRewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。
     分别指出创建的物化视图是否支持查询重写。
     查询重写是指当对物化视图的基表进行查询时,
     Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,
     而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
    
     */
    CREATE MATERIALIZED VIEW V_RPT_ACT_ACTION  
      BUILD IMMEDIATE  
      DISABLE QUERY REWRITE
    AS  
      SELECT * FROM T_ACT_ACTION;
        
    -- 查询物化视图    
    SELECT * FROM V_RPT_ACT_ACTION ORDER BY V_RPT_ACT_ACTION.ACTION_VALUE;
    
    -- 刷新物化视图 刷新时间间隔。每1天刷新一次,时间为凌晨10点
    ALTER MATERIALIZED VIEW V_RPT_ACT_ACTION 
    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');
    
    -- 使用DBMS_MVIEW.REFRESH 手工刷新,刷新物化视图,可以放在存储过程中刷新,存储过程不用写EXEC
    -- DBMS_MVIEW.REFRESH('V_RPT_ACT_ACTION'); 
    
    
    -- EXEC DBMS_MVIEW.REFRESH('V_RPT_ACT_ACTION');  
    -- EXEC DBMS_REFRESH.REFRESH('V_RPT_ACT_ACTION');
    
    -- 完全刷新
    -- EXEC DBMS_MVIEW.REFRESH(LIST => 'V_RPT_ACT_ACTION',METHOD => 'c');  
    -- EXEC DBMS_MVIEW.REFRESH('V_RPT_ACT_ACTION','C');  
    
    --快速刷新   
    -- 表 "BOEREMS"."T_ACT_ACTION" 不带实体化视图日志
    
    -- EXEC DBMS_MVIEW.REFRESH(LIST => 'V_RPT_ACT_ACTION',METHOD => 'f');  
    -- EXEC DBMS_MVIEW.REFRESH('V_RPT_ACT_ACTION','F');  
    
    SELECT SYS_GUID() FROM DUAL;
    
    -- 查询物化视图上次刷新时间
    -- LAST_REFRESH_DATE  上次刷新时间
    
    SELECT * FROM USER_MVIEWS 
        WHERE MVIEW_NAME = 'V_RPT_ACT_ACTION';
    
    -- 手动刷新物化视图
    BEGIN
       DBMS_MVIEW.REFRESH('V_RPT_ACT_ACTION');
    END;
    
    
    
    CREATE OR REPLACE PROCEDURE USP_RVW_REFRESH_VIEW
    
    AS
    
     BEGIN
    
         -- 刷新物化视图
        DBMS_OUTPUT.PUT_LINE('######');
        
        -- DBMS_MVIEW.REFRESH('V_RPT_ACT_ACTION'); 
    
        DBMS_MVIEW.REFRESH('V_RPT_OBJECTIVE_QUESTIONS','C');
        
        -- EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW V_RPT_OBJECTIVE_QUESTIONS';   
        
        DBMS_MVIEW.REFRESH('V_RPT_COURSE_STUDENT','C');
        DBMS_MVIEW.REFRESH('V_RPT_EXAM_STUDENT','C');
        
        -- CALL DBMS_MVIEW.REFRESH('V_RPT_COURSE_STUDENT ','C');
        -- CALL DBMS_MVIEW.REFRESH('V_RPT_EXAM_STUDENT ','C');
    
        DBMS_OUTPUT.PUT_LINE('###### FINISH');
    
    END USP_RVW_REFRESH_VIEW;
    

    相关文章

      网友评论

        本文标题:Oracle物化视图的用法与总结

        本文链接:https://www.haomeiwen.com/subject/umdmdxtx.html