Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。
物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的
选择进行简单说明:
创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。
查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVE*。**ST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。
在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。
物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。
物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。 [Page]
如果对物化视图的基本概念清楚了就比较明白在那里写特定的表空间存储了。
创建物化视图时应先创建存储的日志空间( 存储物化试图的对象的改变信息)
CREATE MATERIALIZED VIEW LOG ON md_cdr_pim_day_01
tablespace ZGMV_DATA --日志保存在特定的表空间
WITH ROWID ;
然后创建物化视图
--创建物化视图
create materialized view MV_TEST
TABLESPACE ZGMV_DATA --保存表空间
BUILD DEFERRED --延迟刷新不立即刷新
refresh force --如果可以快速刷新则进行快速刷新,否则完全刷新
with rowid --根据rowid刷新(默认是主键)
on demand --按照指定方式刷新
start with to_date(’15-03-2008 16:20:51’, ’dd-mm-yyyy hh24:mi:ss’) next sysdate+1/48
as
select DAY_NUMBER,STAT_DATE,USER_ID,MSISDN,
BRAND_ID,AREA_ID,PIM_CODE,OPER_CODE,
CARRIER_TYPE,CHARGE_TYPE,OPER_TYPE,
SEND_STATUS,USER_STATUS,
DATA_UP,DATA_DOWN,UP_CNT,DOWN_CNT,
INFO_FEE,OTHER_FEE,REAL_INFO_FEE,
REAL_OTHER_FEE,PIM_CNT,PERIOD_TIME
from jsdss.md_cdr_pim_day_01@to_bassm2
--删除物化视图:
--删除日志:
DROP materialized view log on md_cdr_pim_day_01;
--删除物化视图
drop materialized view MV_LVY_LEVYDETAILDATA;
--基本和对表的操作一致
--物化视图由于是物理真实存在的,故可以创建索引。
创建方式和对普通表创建方式相同.。
-------------------------------------------------------------------------------------------------------
下面对物化视图进行一下总结,供大家学习!
物化视图的刷新有二类,分别是:on commit ;on demand。
DO1T(u-B$["| t0刷新方法有三种分别是:快速(FAST),完全(COMPLETE),强制(FORCE);**博客首页0q;|&K%T$kn"e-M%gq
ON COMMIT
如果选择on commit ,则在对主表应用上会造成速度,这是因为ORACLE在对主表操作提交后马上会进行刷新物化视图操作,这部分时间是也包括在提交时间中。
a) refresh force on commit:中对删,新增记录,物理视图都能真实反映主表的变化。同时这种情况下不用建物化视图日志表。缺点是提交时间长。**博客首页_ Mhu*_a
b) refresh fast on commit:中对新增或修改能真实反映主表的变化,但对删除则不能反映,必须进行一次完全刷新。
ON DEMAND
DEMAND必须用DBMS_MVIEW.REFRESH存储过程建立的JOB去定时刷新物化视图.
a) refresh fast on DEMAND:必须通过调用DBMS_MVIEW.REFRESH存储过程来进行快速刷新反映主表新增情况;但当对主表中的数据删除或修改时,快速刷新则会报错,因此必须调DBMS_MVIEW.REFRESH的完全刷新才能反映。可以通过建立JOB解决。
快速刷新:exec dbms_mview.refresh(v_advanceservice,'f');
完全刷新:exec dbms_mview.refresh(v_advanceservice,'c');
要注意的是:用FAST刷新物化视图,前提要新建物化视图日志表。
refresh force/complate on DEMAND:
在这种方式下物化视图也是无法自动刷新,必须通过JOB或手工。
FAST、FORCE、COMPLETE区别
FAST:增量式刷新,使用此方法必须有前提,就是建立物化视图日志表。
FORCE::如果可以以fast 方式刷新则用,否则完全刷新。
COMPLETE:默认的选项.先将物化视图表内容删除,然后再刷新。此方式缺点就是在刷新时间内高级搜索将为空.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-611175/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-611175/