OLD_NEW$$:表示物化视图日志中保存的信息是DML操作之前的值(旧值)还是DML操作之后的值(新值)。除了O和N这两种类型外,对于UPDATE操作,还可能表示为U。
CHANGE_VECTOR$$:记录DML操作发生在那个或那几个字段上
当刷新物化视图时,只需要根据SEQUENCE列给出的顺序,通过M_ROW$$定位到基表的记录,如果是UPDATE操作,通过CHANGE_VECTOR$$定位到字段,然后根据基表中的数据重复执行DML操作。
如果物化视图日志只针对一个物化视图,那么刷新过程就是这么简单,还需要做的不过是在刷新之后将物化视图日志清除掉。但是,Oracle的物化视图日志是可以同时支持多个物化视图的快速刷新的,也就是说,物化视图在刷新时还必须判断哪些物化视图日志记录是当前物化视图刷新需要的,哪些是不需要的。而且,物化视图还必须确定,在刷新物化视图后,物化视图日志中哪些记录是需要清除的,哪些是不需要清除的。
回顾一下物化视图日志的结构,发现只剩下一个SHAPTIME$$列,那么Oracle如何仅通过这一列就完成了对多个物化视图的支持呢?
2.2 下面建立一个小例子,通过例子来进行说明:
使用上文中建立的表和物化视图日志,下面对这个表建立三个快速刷新的物化视图,并对t表执行DML操作:
zx@ORA11G>create materialized view mv_t_id
2 refresh fast
3 as select id,count(*)
4 from t
5 group by id;
Materialized view created.
zx@ORA11G>create materialized view mv_t_name
2 refresh fast
3 as select name,count(*)
4 from t
5 group by name;
Materialized view created.
zx@ORA11G>create materialized view mv_t_both
2 refresh fast
3 as select id,name,count(*)
4 from t
5 group by id,name;
Materialized view created.
zx@ORA11G>insert into t values (1, 'zx', 'hb');
1 row created.
zx@ORA11G>insert into t values (2, 'wl', 'sd');
1 row created.
insert into t values (3, 'yc', 'bj');
1 row created.
zx@ORA11G>update t set address = 'bj_cp' where id = 3;
1 row updated.
zx@ORA11G>delete from t where id = 2;
1 row deleted.
zx@ORA11G>commit;
Commit complete.
查询物化视图日志,可以查看每次dml操作都有对应的日志
zx@ORA11G>col M_ROW$$ for a30
zx@ORA11G>col change_vector$$ for a30
zx@ORA11G>set num 20
zx@ORA11G>select * from mlog$_t;