1简介
物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。
物化视图可以查询表,视图和其它的物化视图。
通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。
物化视图对于前台数据库使用者来说如同一个实际的表,具有和一般表相通的如select等操作,而其实际上是一个视图,一个由系统实现定期刷新其数据的视图(具体刷新时间在定义物化视图的时候已有定义),使用物化视图更可以实现视图的所有功能,而物化视图确不是在使用时才读取,大大提高了读取速度,特别适用抽取大数据量表某些信息以及数据链连接表使用。
本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。
2物化视图语法
create materialized view [view_name]
[
[build immediate | build deferred]
[enable query rewrite | disable query rewrite]
[refresh [fast | complete | force | nevel]]
[on demand | commit]
[start with date] [next date]
[with {primary key|rowid}]
]
as
{创建物化视图用的查询语句}
Build Methods(创建方式)
Query Rewrite(查询重写)
查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
Refresh属性 (刷新方式
)
On Demand And Commit属性(刷性机制)
刷新时间控制
根据基表主键或rowid创建
3演示例子
3.1建立物化视图日志
create materialized view log on mv_lvy_levytaxbgtdiv
tablespace zgmv_date --日志保存在特定的表空间
with rowid;
create materialized view log on tb_lvy_levydetaildata
tablespace zgmv_date --日志保存在特定的表空间
with rowid,sequence(levydetaildataid);
create materialized view log on tb_lvy_levydata
tablespace zgmv_date --日志保存在特定的表空间
with rowid,sequence(levydataid);
3.2创建物化视图
create materialized view mv_lvy_levydetaildata
tablespace zgmv_data --保存表空间
build deferred--延迟刷新不立即刷新
refresh force--如果可以快速刷新则进行快速刷新,否则完全刷新
on demand--按照指定方式刷新
start with to_date('24-11-2005 18:00:10', 'dd-mm-yyyy hh24:mi:ss') --第一次刷新时间
next TRUNC(SYSDATE+1)+18/24--刷新时间间隔
as
SELECT levydetaildataid, detaildatano, taxtermbegin, taxtermend,
ROUND(taxdeduct * taxpercent1, 2) - ROUND(taxdeduct * taxpercent2, 2) -
ROUND(taxdeduct * taxpercent3, 2) - ROUND(taxdeduct * taxpercent4, 2) -
ROUND(taxdeduct * taxpercent5, 2) taxdeduct, ROUND(taxfinal * taxpercent1, 2) -
ROUND(taxfinal * taxpercent2, 2) - ROUND(taxfinal * taxpercent3, 2) -
ROUND(taxfinal * taxpercent4, 2) - ROUND(taxfinal * taxpercent5, 2) taxfinal,
a.levydataid, a.budgetitemcode, taxtypecode
FROM tb_lvy_levydetaildata a, tb_lvy_levydata c, MV_LVY_LEVYTAXBGTDIV b WHERE a.levydataid = c.levydataid
AND a.budgetdistrscalecode = b.budgetdistrscalecode
AND a.budgetitemcode = b.budgetitemcode
AND c.incomeresidecode = b.rcvfisccode
AND C.TAXSTATUSCODE='08'
AND C.NEGATIVEFLAG!='9'
3.3删除物化视图日志
DROP materialized view log on mv_lvy_levytaxbgtdiv; --删除物化视图日子DROP materialized view log on tb_lvy_levydetaildata; --删除物化视图日子DROP materialized view log on tb_lvy_levydata; --删除物化视图日子
3.4删除物化视图
drop materialized view mv_lvy_levydetaildata; --删除物化视图
3.5主键物化视图
create materialized view mv_emp_pk
refresh fast--根据视图日志文件DML操作刷新物化视图
start with sysdate--立即刷新视图
next sysdate + 2--下一次刷新视图为两天后的当前时间
with primary key--根据基表主键创建物化视图
as
select * from emp@remote_db;
START WITH子句通知数据库完成从主表到本地表第一次复制的时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的间隔时间.
在上面的例子中,物化视图数据的第一个副本在创建时生成,以后每两天刷新一次.
当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下:
create materialized view log on emp;
3.6Rowid物化视图
create materialized view mv_emp_rowid
refresh
with rowid
as
select * from emp@remote_db;
4物化视图种类
物化视图可以分为以下三种类型:
?包含聚集的物化视图;
?只包含连接的物化视图;
?嵌套物化视图
三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。注释:三种物化视图具体详细介绍请自行查找资料。
5物化视图日志
如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
6常见问题
6.1定位导致物化视图无法快速刷新的原因
物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。但是快速刷新具有较多的约束,而且对于采用ON COMMIT模式进行快速刷新的物化视图更是如此。对于包含聚集和包含连接的物化视图的快速刷新机制并不相同,而且对于多层嵌套的物化视图的快速刷新更是有额外的要求。如此多的限制一般很难记全,当建
立物化视图失败时,Oracle给出的错误信息又过于简单,有时无法使你准确定位到问题的原因。
Oracle提供的dbms_mview.explain_mview过程可以帮助你快速定位问题的原因。
注视:dbms_mview.explain_mview过程使用请查找其他资料。