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

这篇文章主要讨论如何通过修改物化视图日志来同步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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-69375/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值