li
  当前位置:主页 > 性能优化 > 文章内容
li
物化视图是否根据字段进行刷新(一)
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:14  

在以前的一篇文章中,我介绍过Oracle物化视图日志的结构,里面提到过物化视图日志的CHANGE_VECTOR$$列可以记录表中某一条数据的哪个或哪几个字段发生了变化。也就是说Oracle具备了字段级增量的能力,那么物化视图刷新的时候是否仅仅刷新发生变化的字段,还是物化视图的刷新只能够到达记录集。最近正好有人提出这个问题,那么就顺便探讨一下这个问题。

问题来源:http://www.itpub.net/showthread.php?s=&threadid=623102

物化视图日志结构:http://yangtingkun.itpub.net/post/468/20498


下面先看看piliskys的测试,不过我将测试简化了一点,目的在于更清晰的说明问题。

SQL> CREATE TABLE TT (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO TT VALUES (1, 'A');

已创建 1 行。

SQL> INSERT INTO TT VALUES (2, 'B');

已创建 1 行。

SQL> INSERT INTO TT VALUES (3, 'C');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> CREATE MATERIALIZED VIEW LOG ON TT;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_TT REFRESH FAST AS SELECT ID FROM TT;

实体化视图已创建。

这个测试的思路是创建一个物化视图MV_TT,物化视图只包含基表TT中的部分列,如果基表TT发生了更新操作,而被更新的字段恰好是物化视图所不需要的字段,那么如果Oracle采用字段级的刷新,则可以忽略物化视图日志上的记录而不进行刷新,如果Oracle采用记录级的刷新,那么针对每条被更新的记录,Oracle都会重新刷新。

这个测试采用的是在物化视图上建立一个基于UPDATE操作的触发器,在触发器中将发生更新操作的记录的ID写到一个日志表中,通过观察日志表中最终结果,判断物化视图对哪些数据进行了更新。

IXDBA.NET社区论坛

SQL> CREATE TABLE LOG_MV_TT (ID NUMBER);

表已创建。

SQL> CREATE OR REPLACE TRIGGER MV_TT BEFORE UPDATE ON MV_TT
2 FOR EACH ROW
3 BEGIN
4 INSERT INTO LOG_MV_TT VALUES (:NEW.ID);
5 END;
6 /

触发器已创建

SQL> UPDATE TT SET NAME = NAME;

已更新3行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_MVIEW.REFRESH('MV_TT')

PL/SQL 过程已成功完成。

SQL> SELECT * FROM LOG_MV_TT;

ID
----------
1
2
3

SQL> COMMIT;

提交完成。

通过测试可以发现,日志表中包含了3条记录,也就是说,物化视图刷新的过程中更新了全部的数据,即使物化视图并没有包含真正被更新的字段。

根据这个测试的结果,Oracle的物化视图的刷新只是到达了记录级,而没有到达字段级。

不过令人疑惑的是,如果是这样的话,那么CHANGE_VECTOR$$列的意义何在呢?难道Oracle不清楚字段级更新的效率会更高吗?难道Oracle记录了各个字段的更新信息是为了以后版本实现字段级刷新而预留的?Oracle真的做不到字段级的刷新吗?(待续)




  上一篇: 在包含LONG类型的表上建立物化视...   下一篇: 物化视图是否根据字段进行刷新(...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·在包含LONG类型的表上建立物化视...
·物化视图注册信息的清除
·建立物化视图所需权限(四)
·建立物化视图所需权限(三)
·建立物化视图所需权限(二)
·建立物化视图所需权限(一)
·两个导致物化视图无法快速刷新的...
·建立包含ROLLUP或CUBE的物化视图
·物化视图导出导入可能导致物化视...
·物化视图的PCT特性(二)
·物化视图是否根据字段进行刷新(...
·物化视图是否根据字段进行刷新(...
·物化视图复制快速刷新的限制(二...
·GLOBAL_NAME相同的数据库中物化视...
·GLOBAL_NAME相同的数据库中物化视...
·ORA-600(999)错误(二)
·物化视图刷新过程中出现的约束冲...
·ORA-600(999)错误(三)
·建立物化视图导致数据库实例崩溃
·小议物化视图与基表数据不一致的...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接