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 存储过程.调用的时间间隔可以自行设定.