ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 小议物化视图与基表数据不一致的消除(二)

小议物化视图与基表数据不一致的消除(二)

原创 Linux操作系统 作者:yangtingkun 时间:2007-08-05 00:00:00 0 删除 编辑

这篇文章主要讨论如何通过修改物化视图日志来同步INSERT和DELETE操作。

小议物化视图与基表数据不一致的消除(一):http://yangtingkun.itpub.net/post/468/326751


对于物化视图和基表的差别,一共存在三种情况。记录在基表中存在,但是在物化视图中不存在;记录在基表中不存在,但是在物化视图中存在;记录在基表和物化视图中都存在,但是二者不一致。

前面两种情况相当于DELETE和INSERT语句没有应用到物化视图中,而后面一种情况相当于UPDATE语句没有应用到物化视图中。

这里先讨论相对简单的DELETE和INSERT的情况。如果物化视图和基表的数据如下:

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T');

PL/SQL 过程已成功完成。

SQL> SELECT * FROM T;

ID NAME AGE
---------- ------------------------------ ----------
2 TEST 20
3 ABC 15
4 INSERT 30

SQL> SELECT * FROM MV_T;

ID NAME AGE
---------- ------------------------------ ----------
1 DELETE 10
2 TEST 20
3 ABC 15

基表中记录1已经被删除,而物化视图中仍然存在。基表中插入了记录4,而没有同步到物化视图中。

对于上面这两种情况,只需要手工修改物化视图日志就可以实现物化视图数据的同步:

SQL> INSERT INTO MLOG$_T VALUES (4, TO_DATE('4000-1-1', 'YYYY-MM-DD'), 'I', 'N', 'FE');

已创建 1 行。

SQL> INSERT INTO MLOG$_T VALUES (1, TO_DATE('4000-1-1', 'YYYY-MM-DD'), 'D', 'O', '00');

已创建 1 行。

SQL> COMMIT;

提交完成。

第一个字段表示发生变化的记录的ID。

第二个是时间戳填入4000年1月1日,表示任何物化视图还没有对这个记录进行刷新。

第三个字段表示INSERT/UPDATE/DELETE。

第四个字段表示新值(N)/旧值(O)/修改(U)。

最后一个字段表示修改列的矢量。用FE表示INSERT,用00表示DELETE。

关于物化视图日志字段的详细描述可以参考:http://yangtingkun.itpub.net/post/468/20498

关于物化视图是如何利用物化视图日志进行快速刷新的可以参考:http://yangtingkun.itpub.net/post/468/20584

修改MLOG后马上刷新并不会导致数据同步到物化视图:

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T');

PL/SQL 过程已成功完成。

SQL> SELECT * FROM T;

ID NAME AGE
---------- ------------------------------ ----------
2 TEST 20
3 ABC 15
4 INSERT 30

SQL> SELECT * FROM MV_T;

ID NAME AGE
---------- ------------------------------ ----------
1 DELETE 10
2 TEST 20
3 ABC 15

SQL> SELECT * FROM MLOG$_T;

ID SNAPTIME$$ D O CHANGE_VECTOR$$
---------- ---------- - - ----------------------------------------
4 01-1月 -00 I N FE
1 01-1月 -00 D O 00

这是由于Oracle在快速刷新的时候发现基表自上次刷新完成后并未发生修改,因此根本没有去读取物化视图日志。

只要基表数据发生改变,下次物化视图刷新时,会自动将修改同步到物化视图上:

SQL> UPDATE T SET NAME = 'ABC' WHERE ID = 3;

已更新 1 行。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_T');

PL/SQL 过程已成功完成。

SQL> SELECT * FROM T;

ID NAME AGE
---------- ------------------------------ ----------
2 TEST 20
3 ABC 15
4 INSERT 30

SQL> SELECT * FROM MV_T;

ID NAME AGE
---------- ------------------------------ ----------
2 TEST 20
3 ABC 15
4 INSERT 30

通过手工修改物化视图日志,物化视图和基表数据同步完成。需要注意的是,这个方法适用于仅包含一个物化视图的情况或者包含多个物化视图且全部物化视图都出现数据不一致的情况。

对于包含多个物化视图,但是只有个别物化视图数据不一致的情况,需要对这种方法进行适当的改进。这里就不详细介绍了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-69375/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10487943