物化视图使用大全.docx
《物化视图使用大全.docx》由会员分享,可在线阅读,更多相关《物化视图使用大全.docx(9页珍藏版)》请在冰点文库上搜索。
物化视图使用大全
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
物化视图使用大全
物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,也可以称为快照。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
如果你想修改本地副本,必须用高级复制的功能。
当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。
物化视图可以查询表,视图和其它的物化视图。
一、 关于物化视图日志:
查询物化视图日志文件格式:
descmlog$_lzwmvtest;
创建物化视图时默认指定物化视图中存在主键,如果不指定,那么创建的物化视图日志文件的基表必须存在主键,否则会报错
Demo:
对一个表test
创建日志:
creatematerializedviewlogontest;
那么会报:
表'LZWMVTEST'不包含主键约束条件
这种情况下,就必须指定日志文件结构
比如:
creatematerializedviewlogontestwithrowid(具体的针对日志内容方面的在另外一个专题里说明,这里就简述到此)
二、 关于生成数据和刷新:
1>生成数据
两大选项:
buildimmediate builddeferred
Buildimmediate:
在创建物化视图的同时根据主表生成数据
Buliddeferred:
在创建物化视图的同时,在物化视图内不生成数据,如果此时没有生成数据,以后可以采取:
EXECDBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。
2>关于刷新
² 刷新方式:
completefastforce
Complete:
完全刷新整个物化视图,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新
Ø Fast:
当有数据更新时依照相应的规则对物化视图进行更新(此时必须创建物化视图日志(物化视图日志记录了数据更新的日志),关于日志的说明,参照“物化视图日志文件介绍”)
Ø Force:
当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新(此项为默认选项)
不过从实际情况出发,应该尽量不使用默认选项,可以考虑使用增量刷新,对大表特别有效,大表全量更新速度是非常慢的,特别是在存在索引的情况下(在创建物化视图语句中,可能某些限制查询的条件,导致了增量刷新无法使用,这个是需要注意的,具体是哪类语句导致fast刷新不可用,有待总结…..)
² 刷新时间:
ondemandoncommitstartwith/next
Ondemand:
在需要刷新时进行刷新(人工判断)
Oncommit:
在基表上有提交操作时,进行更新
Startwith:
指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数据,则可以考虑在指定的时间刷新,从而生成数据)
Next:
刷新的周期时间
三、 基于主键的物化视图和ROWID的物化视图的说明
创建物化视图日志时,指定了记录更新的原则即with后面的primary或者rowid或者objectid等等,后面,默认是以primarykey为记录更新,在物化视图内也是以此为更新的原则。
例如:
1、如果日志内使用的是primarykey则在创建物化视图时指定rowid来更新,则会报ORA-12032:
不能使用"TEST"上实体化视图日志中的rowid列
2、如过日志内使用的是rowid则在创建物化视图时指定primary或者默认指定,则会报ORA-23415:
"GIS"."LZWMV"的实体化视图日志不记录主键
四、 关于物化视图存放的的表空间
直接在创建物化视图时指定日志存放的表空间和物化视图的表空间。
例子:
creatematerializedviewMV_TESTtablespacetest----表空间名称
五、 关于查询重写和更新
在创建查询重写时,基表中必须有主键约束,视图里是无法创建主键的,不过其继承了基表的主键约束。
(关于视图的创建的一些技巧有待总结……)下面给个例子
CreatematerializedviewMV_TEST
Refreshfast----前提是必须创建基表日志,可以忽略该项
Enablequeryrewrite----前提是基表上必须存在主键约束
As
Select*fromTEST;----物化视图数据生成
六、 关于创建物化视图的例子:
1、使用增量刷新的物化视图的写法
创建物化视图日志,必须创建日志
CreatematerializedviewlogonTEST----TEST为表名
----注:
(TEST为表名或者视图名,关于视图上建立物化视图,见基于视图的物化视图
----创建物化视图语句:
CreatematerializedviewMV_TEST
----MVTEST为物化视图名
Buildimmediate
----创建时生成数据对应的是builddeferred
Refreshfast
----增量刷新
Oncommit
----在基表有更新时提交,这里该句对视图无效
Withrowid
----这里创建基于rowid的物化视图,对应的是primarykey
As
Select*fromTEST;
----生成物化视图数据语句
七、 小的知识点
创建主键约束语句:
altertabletable_nameadd(constraintconstraint_nameprimarykey(columes));
建议使用job来定期刷新物化视图
物化视图创建语法:
CREATEMATERIALIZEDVIEW
PCTFREE--存储参数
PCTUSED--存储参数
TABLESPACE--表空间
BUILDIMMEDIATE|DEFERRED--创建方式
ENABLE|DISABLEQUERYREWRITE--是否支持查询重写
REFRESHON[WITH][INCLUDINGNEWVALUES][]--数据刷新机制,如果需要进行快速刷新,则需要建立物化视图日志,增加WITH子句,且需要创建物化视图日志
[ONPREBUILTTABLE]--将物化视图建立在一个已经存在的表上,这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated
AS(;
creatematerializedviewlogonTableNamewith[PRIMARYKEY|ROWID];
dropmaterializedviewlogonTableName;
dropmaterializedviewViewName;
execDBMS_MVIEW.REFRESH('CYTS.VM_ACCBILL_JOB_FEE');
Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。
物化视图有很多方面和索引很相似:
使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。
物化视图可以分为以下三种类型:
包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。
三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。
创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
创建方式(BuildMethods):
包括BUILDIMMEDIATE和BUILDDEFERRED两种。
BUILDIMMEDIATE是在创建物化视图的时候就生成数据,而BUILDDEFERRED则在创建时不生成数据,以后根据需要在生成数据。
默认为BUILDIMMEDIATE。
查询重写(QueryRewrite):
包括ENABLEQUERYREWRITE和DISABLEQUERYREWRITE两种。
分别指出创建的物化视图是否支持查询重写。
查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。
默认为DISABLEQUERYREWRITE。
刷新(Refresh):
指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。
刷新的模式有两种:
ONDEMAND和ONCOMMIT。
ONDEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。
ONCOMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。
刷新的方法有四种:
FAST、COMPLETE、FORCE和NEVER。
RST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
COMPLETE刷新对整个物化视图进行完全的刷新。
如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。
NEVER指物化视图不进行任何刷新。
默认值是FORCEONDEMAND。
在建立物化视图的时候可以指定ORDERBY语句,使生成的数据按照一定的顺序进行保存。
不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。
物化视图日志:
如果需要进行快速刷新,则需要建立物化视图日志。
物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARYKEY类型的。
还可以选择是否包括SEQUENCE、INCLUDINGNEWVALUES以及指定列的列表。
可以指明ONPREBUILDTABLE语句将物化视图建立在一个已经存在的表上。
这种情况下,物化视图和表必须同名。
当删除物化视图时,不会删除同名的表。
这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。
物化视图可以进行分区。
而且基于分区的物化视图可以支持分区变化跟踪(PCT)。
具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。
对于聚集物化视图,可以在GROUPBY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。
物化视图的基本操作和使用可以查看网址:
/468/13318相关的东东。
我主要说明一下使用物化视图的基本东东。
如如何建立在特定的表空间上,这些在其他的物化视图上面几乎都没有任何介绍的。
主要以我做的一个例子来操作,
如果对物化视图的基本概念清楚了就比较明白在那里写特定的表空间存储了。
创建物化视图时应先创建存储的日志空间
CREATEMATERIALIZEDVIEWLOGONmv_lvy_levytaxbgtdiv
tablespaceZGMV_DATA--日志保存在特定的表空间
WITHROWID;
CREATEMATERIALIZEDVIEWLOGONtb_lvy_levydetaildata
tablespaceZGMV_DATA--日志保存在特定的表空间
WITHROWID,sequence(LEVYDETAILDATAID);
CREATEMATERIALIZEDVIEWLOGONtb_lvy_levydata
tablespaceZGMV_DATA--日志保存在特定的表空间
WITHrowid,sequence(LEVYDATAID);
然后创建物化视图
--创建物化视图
creatematerializedviewMV_LVY_LEVYDETAILDATA
TABLESPACEZGMV_DATA--保存表空间
BUILDDEFERRED--延迟刷新不立即刷新
refreshforce--如果可以快速刷新则进行快速刷新,否则完全刷新
ondemand--按照指定方式刷新
startwithto_date('24-11-200518:
00:
10','dd-mm-yyyyhh24:
mi:
ss')--第一次刷新时间
nextTRUNC(SYSDATE+1)+18/24--刷新时间间隔
as
SELECTlevydetaildataid,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,
......
FROMtb_lvy_levydetaildataa,tb_lvy_levydatac,MV_LVY_LEVYTAXBGTDIVb
WHEREa.levydataid=c.levydataid
ANDa.budgetdistrscalecode=b.budgetdistrscalecode
ANDa.budgetitemcode=b.budgetitemcode
ANDc.incomeresidecode=b.rcvfisccode
ANDC.TAXSTATUSCODE='08'
ANDC.NEGATIVEFLAG!
='9'
删除物化视图日志
--删除物化视图:
--删除日志:
DROPmaterializedviewlogonmv_lvy_levytaxbgtdiv;
DROPmaterializedviewlogontb_lvy_levydetaildata;
DROPmaterializedviewlogontb_lvy_levydata;
--删除物化视图dropmaterializedviewMV_LVY_LEVYDETAILDATA;
--基本和对表的操作一致--物化视图由于是物理真实存在的,故可以创建索引。
创建方式和对普通表创建方式相同,就不在重复写了。
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文