物化视图可以分为以下三种类型:
包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
创建方式(build methods):build immediate和build deferred
build immediate:是在创建物化视图的时候就生成数据,默认为build immediate。
build deferred:在创建时不生成数据,以后根据需要在生成数据。
查询重写(query rewrite):enable query rewrite和disable query rewrite,分别指出创建的物化视图是否支持查询重写。
enable query rewrite:查询重写是指当对物化视图的基表进行查询时,oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为disable query rewrite。
刷新的模式(refresh):on demand和on commit
on demand:指物化视图在用户需要的时候进行刷新,可以手工通过dbms_mview.refresh等方法来进行刷新,也可以通过job定时进行刷新。
on commit:指出物化视图在对基表的dml操作提交的同时进行刷新。
刷新的方法有四种:fast、complete、force和never
fast:采用增量刷新,只刷新自上次刷新以后进行的修改。
complete:对整个物化视图进行完全的刷新。
force:在刷新时会去判断是否可以进行快速刷新,如果可以则采用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,来建立不同等级的聚集物化视图。
create table dim_a (id number primary key, name varchar2(30));
create table dim_b (id number primary key, name varchar2(30));
create table fact (id number, aid number, bid number, num number);
alter table fact add constraint fk_fact_aid foreign key (aid) references dim_a(id);
alter table fact add constraint fk_fact_bid foreign key (bid) references dim_b(id);
insert into dim_a select rownum, 'a'||rownum from user_objects;
insert into dim_b select rownum, 'b'||rownum from user_objects;
insert into fact select rownum, mod(rownum, 6) + 1, mod(rownum, 5 ) + 1, rownum *2 from user_objects;
create materialized view log on dim_a with rowid;
create materialized view log on dim_b with rowid;
create materialized view log on fact with rowid;
create materialized view mv_fact refresh fast on commit as
select f.rowid f_rowid, a.rowid a_rowid, b.rowid b_rowid, f.id,
a.name a_name, b.name b_name, num
from fact f, dim_a a, dim_b b
where f.aid = a.id
and f.bid = b.id;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17012874/viewspace-693809/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17012874/viewspace-693809/