li
  当前位置:主页 > 性能优化 > 文章内容
li
如何确定导致刷新组刷新失败的物化视图(一)
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:21  
本文章共3009字,分2页,当前第1页,快速翻页:
 

当系统中存在多个物化视图,使用刷新组会大大简化物化视图的刷新,只需要将同一时间同步的物化视图全都放到一个刷新组中既可。

9i中,使用刷新组方便的时候有一个缺点,如果其中一个物化视图报错,Oracle给出的错误信息并没有说明是哪个物化视图出了问题。

这篇文章讨论对于本地物化视图,如何定位刷新组中刷新失败的物化视图。


先构造一个简单的例子:

SQL> SELECT * FROM V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 -
Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> CREATE TABLE T1 (ID PRIMARY KEY, NAME) AS SELECT ROWNUM, TNAME FROM TAB;

表已创建。

SQL> CREATE TABLE T2 (ID PRIMARY KEY, NAME) AS SELECT ROWNUM, TNAME FROM TAB;

表已创建。

SQL> CREATE TABLE T3 (ID PRIMARY KEY, NAME) AS SELECT ROWNUM, TNAME FROM TAB;

表已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T1;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T2;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T3;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST AS SELECT * FROM T1;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MV_T2 REFRESH FAST AS SELECT * FROM T2;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MV_T3 REFRESH FAST AS SELECT * FROM T3;

实体化视图已创建。

SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE, 'SYSDATE 1')

PL/SQL 过程已成功完成。

SQL> INSERT INTO T1 VALUES (100, 'A');

IXDBA.NET社区论坛

已创建 1 行。

SQL> INSERT INTO T2 VALUES (100, 'A');

已创建 1 行。

SQL> INSERT INTO T3 VALUES (100, 'A');

已创建 1 行。

SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')

PL/SQL 过程已成功完成。

如果对表T2进行了修改:

SQL> ALTER TABLE T2 MODIFY NAME VARCHAR2(32);

表已更改。

SQL> INSERT INTO T1 VALUES (101, 'B');

已创建 1 行。

SQL> INSERT INTO T2 VALUES (101, LPAD('B', 32, 'B'));

已创建 1 行。

SQL> INSERT INTO T3 VALUES (101, 'B');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROM USER_MVIEWS;

MVIEW_NAME LAST_REFRESH_DATE STALENESS
------------------------------ ------------------- -------------------
MV_T1 2008-01-23 19:22:43 NEEDS_COMPILE
MV_T2 2008-01-23 19:22:43 NEEDS_COMPILE
MV_T3 2008-01-23 19:22:43 NEEDS_COMPILE

SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
BEGIN DBMS_REFRESH.REFRESH('REP_TEST'); END;

* 1 行出现错误:
ORA-12008:
实体化视图的刷新路径中存在错误

ORA-01401:
插入的值对于列过大
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 794
ORA-06512:
"SYS.DBMS_SNAPSHOT", line 851
ORA-06512:
"SYS.DBMS_IREFRESH", line 683
ORA-06512:
"SYS.DBMS_REFRESH", line 195
ORA-06512:
line 1

这时就会出现刷新错误,而Oracle给出的错误信息虽然很明确,但是并没有指出具体是那张表出现了错误,而只有找到错误的表才能定位并解决问题。

其实这个问题的解决方法有很多,比如写一个过程,对刷新组中所有的物化视图进行依次刷新,出现错误时弹出异常。也可以利用



阅读更多内容1 · 2 · 下一页>>


  上一篇: 使用当前用户的数据库链的实现   下一篇: 函数索引产生隐藏列
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
 相关篇章
·使用当前用户的数据库链的实现
·添加字段对SQL的影响
·如何确定导致刷新组刷新失败的物...
·我的oracle笔记,欢迎收看!
·案例解决:一次oracle掉电的处理...
·阿里巴巴公司DBA笔试题
·Oracle数据库ASM功能详解
·Java用OCI驱连Oracle数据库的实现...
·oracle问题小结一:ORACLE常见错...
·Oracle优化经典文章--磁盘I/O和碎...
·函数索引产生隐藏列
·ORA-600(ktsircinfo_num1)错误
·Oracle10201在Enterprise Linux ...
·表异常增大的bug
·数据库升级造成的X_$BH状态异常问...
·9i上使用CONNECT BY访问DUAL表的...
·使用SQL判断一个数是否质数
·缺少GROUP BY表达式可以顺利执行...
·临时表产生REDO过多的bug
·ORA-21561错误
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接