一、关于物化视图日志:
查询物化视图日志文件格式:descmlog$_lzwmvtest;
创建物化视图时默认指定物化视图中存在主键,如果不指定,那么创建的物化视图日志文件的基表必须存在主键,否则会报错
Demo:对一个表test
创建日志:create materialized view logon test;
那么会报:表'LZWMVTEST'不包含主键约束条件
这种情况下,就必须指定日志文件结构
比如:create materialized view log on test withrowid(具体的针对日志内容方面的在另外一个专题里说明,这里就简述到此)
二、关于生成数据和刷新:
1>生成数据
两大选项:buildimmediatebuilddeferred
Buildimmediate:在创建物化视图的同时根据主表生成数据
Buliddeferred:在创建物化视图的同时,在物化视图内不生成数据,如果此时没有生成数据,以后可以采取:EXECDBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。
2>关于刷新
²刷新方式:complete fast force
Complete:完全刷新整个物化视图,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新
ØFast:当有数据更新时依照相应的规则对物化视图进行更新(此时必须创建物化视图日志(物化视图日志记录了数据更新的日志),关于日志的说明,参照“物化视图日志文件介绍”)
ØForce:当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新(此项为默认选项)
不过从实际情况出发,应该尽量不使用默认选项,可以考虑使用增量刷新,对大表特别有效,大表全量更新速度是非常慢的,特别是在存在索引的情况下(在创建物化视图语句中,可能某些限制查询的条件,导致了增量刷新无法使用,这个是需要注意的,具体是哪类语句导致fast刷新不可用,有待总结…..)
²刷新时间:on demand on commit start with/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" 的实体化视图日志不记录主键
四、关于物化视图存放的的表空间
直接在创建物化视图时指定日志存放的表空间和物化视图的表空间。
例子:creatematerialized view MV_TEST tablespace test ----表空间名称
五、关于查询重写和更新
在创建查询重写时,基表中必须有主键约束,视图里是无法创建主键的,不过其继承了基表的主键约束。(关于视图的创建的一些技巧有待总结……)下面给个例子
Creatematerialized view MV_TEST
Refresh fast----前提是必须创建基表日志,可以忽略该项
Enable queryrewrite ----前提是基表上必须存在主键约束
As
Select * fromTEST; ----物化视图数据生成
六、关于创建物化视图的例子:
1、 使用增量刷新的物化视图的写法
创建物化视图日志,必须创建日志
Creatematerialized view log on TEST ----TEST为表名
----注:(TEST为表名或者视图名,关于视图上建立物化视图,见基于视图的物化视图
----创建物化视图语句:
Creatematerialized view MV_TEST
----MVTEST为物化视图名
Buildimmediate
----创建时生成数据对应的是builddeferred
Refresh fast
----增量刷新
On commit
----在基表有更新时提交,这里该句对视图无效
Withrowid
----这里创建基于rowid的物化视图,对应的是primary key
As
Select * fromTEST;
----生成物化视图数据语句
七、小的知识点
创建主键约束语句:alter tabletable_name add(constraint constraint_name primarykey(columes));
建议使用job来定期刷新物化视图