日期:2014-05-16  浏览次数:20526 次

物化视图的简单应用

1.创建示例表

?

create table t1(t11 varchar2(10),t12 varchar2(10),t13 varchar2(10));
alter table T1
  add constraint pk_t11 primary key (T11);  --主键是必须地,后面用得到
insert into t1(t11,t12,t13) values ('a1','aa','aaa') ;
insert into t1(t11,t12,t13) values ('a2','aa','aaa') ;
insert into t1(t11,t12,t13) values ('a3','aa','aaa') ;
insert into t1(t11,t12,t13) values ('a4','aa','aaa') ;
insert into t1(t11,t12,t13) values ('a5','aa','aaa') ;
insert into t1(t11,t12,t13) values ('a6','aa','aaa') ;
commit ;
create table t2(t21 varchar2(10) ,t22 varchar2(10),t23 varchar2(10));
alter table T2
  add constraint pk_t21 primary key (T21);  --主键是必须地,后面用得到
insert into t2(t21,t22,t23) values ('a1','bb','bbb') ;
insert into t2(t21,t22,t23) values ('a2','bb','bbb') ;
insert into t2(t21,t22,t23) values ('a3','bb','bbb') ;
insert into t2(t21,t22,t23) values ('a4','bb','bbb') ;
insert into t2(t21,t22,t23) values ('a5','bb','bbb') ;
insert into t2(t21,t22,t23) values ('a6','bb','bbb') ;
commit ;

?

2.创建物化视图以物化视图日志

?

例1(个人推荐使用).
/*
要想实时刷新并且是增量刷新必须创建物化视图日志,
因为物化视图是根据日志与基表进行沟通的,
创建物化视图日志的前提是必须在基表中建立主键
*/
CREATE MATERIALIZED VIEW LOG ON t1 ; 
CREATE MATERIALIZED VIEW LOG ON t2 ;

--创建物化视图
create materialized view MV_T  --物化视图名称
TABLESPACE JWZH --保存表空间  
BUILD DEFERRED --延迟刷新不立即刷新  
refresh force --如果可以快速刷新则进行快速刷新,否则完全刷新  
on demand --按照指定方式刷新(可以用DBMS_MVIEW.REFRESH或者Job的方式刷新)
start with sysdate --第一次刷新时间(也可以使用to_date('24-11-2005 18:00:10', 'dd-mm-yyyy hh24:mi:ss'))
--刷新时间间隔,大概30分钟刷新一次(可以改成1/720,大概5分钟左右刷新一次),经过测试在oracle10g中指定BUILD DEFERRED参数也是可以自动刷新的
next sysdate + 1/48 
as
select t1.*,t2.* from t1,t2 where t1.t11 = t2.t21 ;
例2.
Create MATERIALIZED VIEW mv_t_demand
REFRESH COMPLETE --对整个物化视图进行完全刷新
ON DEMAND  --立即刷新,影响基表的插入速度
START WITH sysdate 
NEXT SYSDATE + 1/360 
AS
select t1.*,t2.* from t1,t2 where t1.t11 = t2.t21 ;
?

如果第一种方法没有自己刷新,那么可以通用Job的方式刷新物化视图.

-- 用于存放Job的执行时间
create table job_execStat (job varchar2(100),start_time date,end_time date);
-- Job需要调用的存储过程
create or replace procedure ref_mv as
start_time date;
end_time date;
begin  
select sysdate into start_time from dual;
exec dbms_mview.refresh('MV_T') ;
select sysdate into end_time from dual;  
insert into job_exedura values('job_execStat',start_time , end_time);
commit;
end;
Job可以在PL/SQL Deve中直接创建并调用 ref_mv 存储过程.调用的时间间隔可以自行设定.?

?

?

?

?

?

?

?

?

?

?