create table tastTable(
id number,
name varchar2(50)
);
insert into tastTable(Id, Name)values(1,'张三');
insert into tastTable(Id, Name)values(2,'李四');
insert into tastTable(Id, Name)values(3,'李五');
insert into tastTable(Id, Name)values(4,'李六');
insert into tastTable(Id, Name)values(5,'李七);
CREATE MATERIALIZED VIEW mv_tasttable
REFRESH FORCE --刷新的方式
ON DEMAND --刷新的时机
START WITH SYSDATE --刷新开始时间,每一分钟刷新一次
NEXT sysdate+1/1440
AS select * from tasttable;
其中 REFRESH FORCE 还可以选择 fast,complete两种方式, fast 快速刷新,意思就是增量更新,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去,个人感觉这种方式限制太多,实际应用中很难适用,complete 完全刷新,就相当于会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图,还有 FORCE方式 ,这种方式Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。
刷新的时机,ON DEMAND还可以选择 on commit 方式,意思是根据基表的事务提交来刷新物化视图,这种方式看起来很好很方便,但是我感觉如果基表一下子提交很多事物的话就不知道情况会怎么样了,对了不了解的情况还是慎用比较好,然后,ON DEMAND的方式仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性,简而言之,需要我们去触发更新,这里可以直接在创建视图的时候就设置好刷新的时间间隔,就像我上面的例子,还有就是在数据库创建定时任务去执行刷新,这种比较麻烦,而且效果类似
最后,我上面的例子就是我认为比较常用的设置,目的主要是为了提高查询的效率,业务上是允许我有刷新间隔的,在这里记录一下