Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也能够称为快照。sql
物化视图能够用于预先计算并保存表链接或汇集等耗时较多的操做的结果,这样,在执行查询时,就能够避免进行这些耗时的操做,而从快速的获得结果。物化视图有不少方面和索引很类似:使用物化视图的目的是为了提升查询性能;物化视图对应用透明,增长和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图须要占用存储空间;当基表发生变化时,物化视图也应当刷新。数据库
物化视图能够查询表,视图和其它的物化视图。网络
一般状况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。oracle
对于复制,物化视图容许你在本地维护远程数据的副本,这些副本是只读的。若是你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你能够用从物化视图中抽取。函数
对于数据仓库,建立的物化视图一般状况下是聚合视图,单一表聚合视图和链接视图。性能
在复制环境下,建立的物化视图一般状况下主键,rowid,和子查询视图。ui
物化视图因为是物理真实存在的,故能够建立索引。spa
(1) 包含汇集的物化视图;.net
(2) 只包含链接的物化视图;日志
(3) 嵌套物化视图。
三种物化视图的快速刷新的限制条件有很大区别,而对于其余方面则区别不大。建立物化视图时能够指定多种选项,下面对几种主要的选择进行简单说明:
(1)建立方式(BuildMethods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。
BUILD IMMEDIATE是在建立物化视图的时候就生成数据。
BUILD DEFERRED则在建立时不生成数据,之后根据须要在生成数据。默认为BUILD IMMEDIATE。
(2)查询重写(QueryRewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。
分别指出建立的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断可否经过查询物化视图来获得结果,若是能够,则避免了汇集或链接操做,而直接从已经计算好的物化视图中读取数据。默认为DISABLEQUERY REWRITE。
(3)刷新(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语句,使生成的数据按照必定的顺序进行保存。不过这个语句不会写入物化视图的定义中,并且对之后的刷新也无效。
1) 彻底刷新(COMPLETE)会删除表中全部的记录(若是是单表刷新,可能会采用TRUNCATE的方式),而后根据物化视图中查询语句的定义从新生成物化视图。
2) 快速刷新(FAST)采用增量刷新的机制,只将自上次刷新之后对基表进行的全部操做刷新到物化视图中去。FAST必须建立基于主表的视图日志。
对于增量刷新选项,若是在子查询中存在分析函数,则物化视图不起做用。
3) 采用FORCE方式,Oracle会自动判断是否知足快速刷新的条件,若是知足则进行快速刷新,不然进行彻底刷新。
Oracle物化视图的快速刷新机制是经过物化视图日志完成的。Oracle经过一个物化视图日志还能够支持多个物化视图的快速刷新。
物化视图日志根据不一样物化视图的快速刷新的须要,能够创建为ROWID或PRIMARY KEY类型的。还能够选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
REFRESH 子句能够包含以下部分:
[refresh [fast|complete|force]
[on demand | commit]
[start with date] [next date]
[with {primary key|rowid}]]
WITH PRIMARY KEY选项生成主键物化视图,也就是说物化视图是基于主表的主键,而不是ROWID(对应于ROWID子句). PRIMARY KEY是默认选项,为了生成PRIMARY KEY子句,应该在主表上定义主键,不然应该用基于ROWID的物化视图.
基于ROWID物化视图只有一个单一的主表,不能包括下面任何一项:
(1).Distinct 或者聚合函数.
(2) .Group by,子查询,链接和SET操做
--主键(PrimaryKey)物化视图示例:
在远程数据库表emp上建立主键物化视图:
CREATEMATERIALIZEDVIEW mv_emp_pk REFRESHFASTSTARTWITHSYSDATE NEXT SYSDATE + 1/48 WITHPRIMARYKEY ASSELECT * FROM emp@remote_db
--当用FAST选项建立物化视图,必须建立基于主表的视图日志,以下:
CREATEMATERIALIZEDVIEWLOGON emp;
--Rowid物化视图示例:
下面的语法在远程数据库表emp上建立Rowid物化视图
CREATEMATERIALIZEDVIEW mv_emp_rowid REFRESHWITHROWID ASSELECT * FROM emp@remote_db; Materializedviewlog created.
--子查询物化视图示例:
在远程数据库表emp上建立基于emp和dept表的子查询物化视图
CREATEMATERIALIZEDVIEW mv_empdept ASSELECT * FROM emp@remote_db e WHEREEXISTS (SELECT * FROM dept@remote_db d WHEREe.dept_no = d.dept_no)
START WITH子句通知数据库完成从主表到本地表第一次复制的时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的间隔时间.
CREATEMATERIALIZEDVIEW mv_emp_pk REFRESHFAST STARTWITHSYSDATE NEXT SYSDATE + 2 WITHPRIMARYKEY ASSELECT * FROM emp@remote_db;
在上面的例子中,物化视图数据的第一个副本在建立时生成,之后每两天刷新一次.
creatematerializedviewMV_LVY_LEVYDETAILDATA TABLESPACE ZGMV_DATA --保存表空间 BUILDDEFERRED--延迟刷新不当即刷新 refreshforce--若是能够快速刷新则进行快速刷新,不然彻底刷新 ondemand--按照指定方式刷新 startwith to_date('24-11-200518:00:10', 'dd-mm-yyyyhh24:mi:ss') --第一次刷新时间 nextTRUNC(SYSDATE+1)+18/24--刷新时间间隔 as SELECT * FROM emp@remote_db;
在建立物化视图时指明ON PREBUILD TABLE语句,能够将物化视图创建在一个已经存在的表上。这种状况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。
这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。
物化视图能够进行分区。并且基于分区的物化视图能够支持分区变化跟踪(PCT)。具备这种特性的物化视图,当基表进行了分区维护操做后,仍然能够进行快速刷新操做。对于汇集物化视图,能够在GROUP BY列表中使用CUBE或ROLLUP,来创建不一样等级的汇集物化视图。
相关内容参考:
http://blog.csdn.net/tianlesoftware/article/details/7720580
http://blog.csdn.net/tianlesoftware/article/details/7719789
http://blog.csdn.net/tianlesoftware/article/details/7719679
1. 建立物化视图须要的权限:
GRANT CREATE MATERIALIZED VIEW TO USER_NAME;
2. 在源表创建物化视图日志
CREATE MATERIALIZED VIEW LOG ON DAVE TABLESPACE&BISONCU_SPACE -- 日志空间 WITH PRIMARY KEY; -- 指定为主键类型
3. 受权给中间用户
GRANT SELECT ON DAVE TO ANQING; GRANT SELECT ON MLOG$_DAVE TO ANQING;
4. 在目标数据库上建立MATERIALIZED VIEW
CREATE MATERIALIZED VIEW AICS_DAVE TABLESPACE&BISONCS_SPACE REFRESH FAST ON DEMAND --第一次刷新时间 --START WITH to_date('2012-01-01 20:00:00', 'yyyy-mm-dd hh24:mi:ss') START WITH SYSDATE --刷新时间间隔。每1天刷新一次,时间为凌晨2点 --NEXT TRUNC(SYSDATE,'dd')+1+2/24 NEXT SYSDATE+1/24/20 WITH PRIMARY KEY --USING DEFAULT LOCAL ROLLBACKSEGMENT DISABLE QUERY REWRITE AS SELECT MODEL_ID, STATUS,MODEL_NAME, MANU_ID, DESCRIPTION, CREATE_TIME, UPDATE_TIME, SW_VERSION FROM AICS_DAVE@LINK_DAVE;
5. 在目标物化视图上建立索引
CREATE INDEX IDX_T_DV_CT ON AICS_DEV_INFO (CREATE_TIME, UPDATE_TIME) TABLESPACE &BISON_IDX; CREATE INDEX IDX_T_DV_UT ON AICS_DEV_INFO (UPDATE_TIME) TABLESPACE &BISON_IDX; CREATE INDEX I_T_DV_MSISDN ON AICS_DEV_INFO (MSISDN) TABLESPACE &BISON_IDX;
6. 物化视图刷新说明
(1)使用dbms_mview.refresh 手工刷新
如:
EXEC DBMS_MVIEW.REFRESH('MV_DAVE'); --彻底刷新 EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'c'); EXEC DBMS_MVIEW.REFRESH('MV_DAVE','C'); --快速刷新 EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'f'); EXEC DBMS_MVIEW.REFRESH('MV_DAVE','F');
(2)使用dbms_refresh.refresh 过程来批量刷新MV
若是咱们在建立物化视图的过程指定start 和next time的刷新时间,那么Oracle 会自动建立刷新的job,并采用dbms_refresh.refresh 的方式。
使用这种方式刷新以前须要先make refresh group,而后才能够刷新。
Refreshmake 的语法能够参考:
http://docs.oracle.com/cd/B19306_01/server.102/b14227/rarrefreshpac.htm#i94057
示例:
假设存在物化视图MV_T1, MV_T2, MV_T3. 建立refresh group的语法以下:
SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE, 'SYSDATE+ 1') --刷新整个refresh group 组: SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
7. 删除物化视图及日志
--删除物化视图日志: DROP MATERIALIZED VIEW LOG ON DAVE; --删除物化视图 DROP MATERIALIZED VIEW MV_DAVE;
8. 查看物化视图刷新状态信息
SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROMUSER_MVIEWS; SQL> SELECT NAME, LAST_REFRESH FROM USER_MVIEW_REFRESH_TIMES;
9. 查询物化视图日志:
SELECT * FROM MLOG$_DAVE;
注:
整理自网络
-------------------------------------------------------------------------------------------------------
版权全部,文章容许转载,但必须以连接方式注明源地址,不然追究法律责任!
Skype: tianlesoftware
QQ: tianlesoftware@gmail.com
Email: tianlesoftware@gmail.com
Blog: http://www.tianlesoftware.com
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware