您的位置:首页 > 其它

物化视图详解--介绍、创建方法、例子

2011-06-26 23:25 776 查看
    物化视图,它是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,从而快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL 语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。   

其中物化视图有三种:聚集物化视图、包含连接物化视图、嵌套物化视图。但三种物化视图的快速刷新的限制条件有很大区别,而其他方面则区别不大。 创建物化视图  创建物化视图时可以指定多种选项,主要选项如下:   

1、创建方式(Build Methods):Build Immediate 和Build Deferred两种。Build Immediate 是在创建物化视图的时候就生成数据,而Build Deferred则在创建时不生成数据,以后根据需要在生成数据。默认为Build Immediate 。   

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

3、刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:On Demand和On Commit。On Demand指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。On Commit指物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:Fast 、Complete 、Force和Never。Fast 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。Complete
刷新对整个物化视图进行完全的刷新。如果选择Force方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用Complete 的方式。Never指物化视图不进行任何刷新。默认值是Force On Demand。   在建立物化视图的时候可以指定Order by 语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。   

4、物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为RowID或Primary Key类型的。还可以选择是否包括Sequence、Including New Values以及指定列的列表。   可以指明On PreBuild Table语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数Query_Rewrite_integerity必须设置为 trusted或者stale_tolerated。
  

5、物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在Group by 列表中使用Cube或RollUp,来建立不同等级的聚集物化视图。   

示例1:   create materialized view MV_ DOP_TEST   refresh force on demand   as   select dsso.dop_id,   soo.work_center_no,   soo.operation_description   from SHOP_ORDER_OPERATION SOO,   DOP_SUPPLY_SHOP_ORD DSSO   where soo.order_no=dsso.order_no   and soo.release_no=dsso.release_no
  and soo.sequence_no=dsso.sequence_no;   ---其中创建与删除物化视图与其表或视图DDL一样:   DROP materialized view log on materialized_view_log_name ;   创建物化视图时创建存储的日志空间(存储物化视图的对象的改变信息)   CREATE MATERIALIZED VIEW LOG ON Dop_Supply_Shop_Ord_Tab --(基表名)   tablespace ifsapp_DATA
--日志保存在特定的表空间   WITH ROWID ;   drop materialized view MV_materialized_view_name ;   

示例2:   create materialized view MV_DOP_TEST   TABLESPACE ifsapp_DATA --保存表空间   BUILD DEFERRED --延迟刷新不立即刷新,此建立初始视图一般没数据   refresh force --如果可以快速刷新则进行快速刷新,否则完全刷新   with rowid --根据rowid刷新(默认是主键)   On demand --按照指定方式刷新   start with to_date('2008-12-11 13:20:51','YYYY-MM-DD
HH24:MI:SS') next sysdate+1/48   as   select dsso.dop_id,   soo.work_center_no,   soo.operation_description   from SHOP_ORDER_OPERATION SOO,   DOP_SUPPLY_SHOP_ORD DSSO   where soo.order_no=dsso.order_no   and soo.release_no=dsso.release_no   and soo.sequence_no=dsso.sequence_no

其他

一、 关于物化视图日志:查询物化视图日志文件格式:desc mlog$_lzwmvtest;创建物化视图时默认指定物化视图中存在主键,如果不指定,那么创建的物化视图日志文件的基表必须存在主键,否则会报错Demo:对一个表test创建日志:create materialized view log on test;那么会报:表'LZWMVTEST'不包含主键约束条件这种情况下,就必须指定日志文件结构比如:create materialized view log on test with rowid(具体的针对日志内容方面的在另外一个专题里说明,这里就简述到此)

二、 关于生成数据和刷新:1>生成数据两大选项:build immediate build deferredBuild immediate:在创建物化视图的同时根据主表生成数据Bulid deferred:在创建物化视图的同时,在物化视图内不生成数据,如果此时没有生成数据,以后可以采取:EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。2>关于刷新² 刷新方式:complete
fast forceComplete :完全刷新整个物化视图,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新Ø Fast:当有数据更新时依照相应的规则对物化视图进行更新(此时必须创建物化视图日志(物化视图日志记录了数据更新的日志),关于日志的说明,参照“物化视图日志文件介绍”)Ø Force:当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新(此项为默认选项)不过从实际情况出发,应该尽量不使用默认选项,可以考虑使用增量刷新,对大表特别有效,大表全量更新速度是非常慢的,特别是在存在索引的情况下(在创建物化视图语句中,可能某些限制查询的条件,导致了增量刷新无法使用,这个是需要注意的,具体是哪类语句导致fast刷新不可用,有待总结…..)²
刷新时间:on demand on commit start with/ nextOn demand:在需要刷新时进行刷新(人工判断)On commit:在基表上有提交操作时,进行更新Start with:指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数据,则可以考虑在指定的时间刷新,从而生成数据)Next:刷新的周期时间

三、 基于主键的物化视图和ROWID的物化视图的说明创建物化视图日志时,指定了记录更新的原则即with 后面的primary 或者rowid 或者object id等等,后面,默认是以primary key为记录更新,在物化视图内也是以此为更新的原则。例如:1、如果日志内使用的是primary key 则在创建物化视图时指定rowid来更新,则会报ORA-12032: 不能使用 "TEST" 上实体化视图日志中的 rowid 列2、如过日志内使用的是rowid 则在创建物化视图时指定primary或者默认指定,则会报ORA-23415:
"GIS"."LZWMV" 的实体化视图日志不记录主键

四、 关于物化视图存放的的表空间直接在创建物化视图时指定日志存放的表空间和物化视图的表空间。例子:create materialized view MV_TEST tablespace test ----表空间名称

五、 关于查询重写和更新在创建查询重写时,基表中必须有主键约束,视图里是无法创建主键的,不过其继承了基表的主键约束。(关于视图的创建的一些技巧有待总结……)下面给个例子Create materialized view MV_TESTRefresh fast ----前提是必须创建基表日志,可以忽略该项Enable query rewrite ----前提是基表上必须存在主键约束AsSelect * from TEST; ----物化视图数据生成

六、 关于创建物化视图的例子:1、 使用增量刷新的物化视图的写法创建物化视图日志,必须创建日志Create materialized view log on TEST ----TEST为表名----注:(TEST为表名或者视图名,关于视图上建立物化视图,见基于视图的物化视图----创建物化视图语句:Create materialized view MV_TEST ----MVTEST为物化视图名Build immediate ----创建时生成数据对应的是build deferredRefresh fast
----增量刷新On commit ----在基表有更新时提交,这里该句对视图无效With rowid----这里创建基于rowid的物化视图,对应的是 primary keyAsSelect * from TEST;----生成物化视图数据语句
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: