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

ORACLE物化视图--循序渐进MView(二) MView Log的结构与快速刷新

?

前言
MView Log的结构
刷新的过程
完全刷新的过程
快速刷新过程
参考资料


前言

现在我们通过一些例子来说明一下MView Log的基本结构以及MView快速刷新的过程。

在这一部分里面,我们还是利用上一部分提供的例子先建立一个MView,同时也创建该MView基表的MView Log。

-- 创建一个测试用的表T
USER@orcl>?create?table?t?(a?int,?b?varchar2(50),?constraint?pk_tprimary?key(a));
Table?created.
?
-- 创建对应的MV名为MVT
USER@orcl>?create?materialized?view?mvt?as?select?*?from?t;
Materialized?view?created.
?
-- 现在往表里面插入一些个数据
USER@orcl>?insert?into?t?select?rownum,?object_name?fromall_objects;
11449?rows?created.
?
USER@orcl>?commit;
Commit?complete.
?
-- 下面对mview做一次刷新看看
USER@orcl>?exec?dbms_mview.refresh('mvt');
PL/SQL?procedure?successfully?completed.
?
-- 创建MView Log
USER@orcl>?create?materialized?view?log?on?t;
Materialized?view?log?created.
?
-- 接下来就是进行快速刷新了
USER@orcl>?exec?dbms_mview.refresh('mvt',?'F');
PL/SQL?procedure?successfully?completed.

?


MView Log的结构

我们先看一下两个测试表的MView Log的结构:

-- 含有PK的MView
USER@orcl>?desc?mlog$_t;
?Name? ? ? ? ? ? ? ? ?Null?? ??Type
?-------------------- -------- --------------
?A? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NUMBER
?SNAPTIME$$? ? ? ? ? ? ? ? ? ??DATE
?DMLTYPE$$? ? ? ? ? ? ? ? ? ? ?VARCHAR2(1)
?OLD_NEW$$? ? ? ? ? ? ? ? ? ? ?VARCHAR2(1)
?CHANGE_VECTOR$$? ? ? ? ? ? ? ?RAW(255)

现在我们挨个说一下各列的含义:

A
这个我们基表T的主键列,如果基表的主键是一个复合索引的话那这里也就存在多个和基表定义一样的列,当基表被修改以后,基表的主键就会被记录到这个列里面。
SNAPTIME$$
用来记录MView刷新的时间,这个字段只有在一个基表对应一个以上的MView的时候才有意义,因为对于一个MView Log来说,只有当所有的MView都刷新完了以后才能把MView Log里面的记录删除,当一个MView刷新的时候,它会把此列置成该MView刷新的时候,在这个MView再次刷新的时候,那些上次刷新过的列就不用再次被刷新了。

下面我们用一个例子来说明一下:

-- 在建立一个基于表T的MView MVT2
USER@orcl>?create?materialized?view?mvt2?as?select?*?from?t;
Materialized?view?created.
?
-- 先做一次刷新
USER@orcl>?exec?dbms_mview.refresh('mvt2');
PL/SQL?procedure?successfully?completed.
?
-- 现在对表T做一些修改
USER@orcl>?update?t?set?b=upper(b)?where?rownum<5;
?
4?rows?updated.
?
-- 现在看看MView Log的记录
USER@orcl>?select?*?from?mlog$_t;
?
?? ? ? ??A?SNAPTIME$$? ? ? ? ??D?O?CHANGE_VEC
---------- ------------------- - - ----------
?? ? ??936?4000-01-01?00:00:00?U?U?04
?? ? ??937?4000-01-01?00:00:00?U?U?04
?? ? ??938?4000-01-01?00:00:00?U?U?04
?? ? ??939?4000-01-01?00:00:00?U?U?04
?
-- 现在我们刷新MVT
USER@orcl>?exec?dbms_mview.refresh('mvt','f');
?
PL/SQL?procedure?successfully?completed.
?
-- 我们可以看到SNAPTIME$$时间变了
USER@orcl>?select?*?from?mlog$_t;
?
?? ? ? ??A?SNAPTIME$$? ? ?