li
  当前位置:主页 > 性能优化 > 文章内容
li
函数索引产生隐藏列
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:5  
本文章共1815字,分2页,当前第1页,快速翻页:
 

前两天在进行LOGMNR操作的时候发现了空的列名,经检查发现是函数索引造成的隐藏列。


由于需要处理一些已经提交的数据,且提交时间超过了可以闪回的时间,因此采用LOGMNR来处理。处理过程中,发现得到的SQL语句中,包含了空列的情况,情况类似下面的例子:

SQL> CONN SYS@YTK102 AS SYSDBA输入口令: 已连接。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> SELECT GROUP#, FIRST_TIME FROM V$LOG;

GROUP# FIRST_TIME
---------- -------------------
1 2008-01-18 22:35:57
2 2008-01-20 18:58:37
3 2008-01-16 23:56:50

SQL> SELECT MEMBER FROM V$LOGFILE WHERE GROUP# = 2;

MEMBER
--------------------------------------------------------------
E:ORACLEORADATAYTK102REDO02.LOG

SQL> ALTER SYSTEM SWITCH LOGFILE;

系统已更改。

SQL> EXEC DBMS_LOGMNR.ADD_LOGFILE('E:ORACLEORADATAYTK102REDO02.LOG', DBMS_LOGMNR.NEW)

PL/SQL 过程已成功完成。

SQL> EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)

PL/SQL 过程已成功完成。

SQL> SELECT SQL_UNDO FROM V$LOGMNR_CONTENTS
2 WHERE SEG_NAME = 'T_LOGMNR';

SQL_UNDO
--------------------------------------------------------------------------
insert into "YANGTK"."T_LOGMNR"("ID","NAME","") values ('1','A',NULL);
insert into "YANGTK"."T_LOGMNR"("ID","NAME","") values ('2','B',NULL);
insert into "YANGTK"."T_LOGMNR"("ID","NAME","") values ('3','C',NULL);

可以看到T_LOGMNR表后面跟了一个空的列,而这个列的值也是NULL

检查表结构:

SQL> DESC YANGTK.T_LOGMNR
名称 是否为空? 类型
--------------------------------------------- -------- ----------------
ID NOT NULL NUMBER
NAME VARCHAR2(30)

IXDBA.NET技术社区

SQL> SELECT TABLE_NAME, COLUMN_NAME FROM DBA_TAB_COLUMNS
2 WHERE TABLE_NAME = 'T_LOGMNR'
3 AND OWNER = 'YANGTK';

TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
T_LOGMNR ID
T_LOGMNR NAME

从数据字典中找不到这个空列的信息,直接查询COL$表:

SQL> SELECT OBJECT_ID FROM DBA_OBJECTS
2 WHERE OBJECT_NAME = 'T_LOGMNR'
3 AND OWNER = 'YANGTK';

OBJECT_ID
----------
53636

SQL> SELECT NAME FROM COL$ WHERE OBJ# = 53636;

NAME
------------------------------
ID
NAME
SYS_NC00003$

COL$中可以看到这个隐藏列了,下面进一步检查,这个隐藏列到底是什么:

SQL> SELECT NAME, DEFAULT$ FROM COL$ WHERE OBJ# = 53636;

NAME DEFAULT$
------------------------------ --------------------------------------------
ID
NAME
SYS_NC00003$ DECODE("ID",1,"NAME"||'1',"NAME"||'2')

目前已经可以看出这个列是一个基于基础列的函数表达式,对比函数索引列:

SQL> SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS FROM DBA_INDEXES
2 WHERE TABLE_NAME = 'T_LOGMNR'
3 AND TABLE_OWNER = 'YANGTK';

INDEX_NAME INDEX_TYPE UNIQUENES
------------------------------ --------------------------- ---------



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


  上一篇: 如何确定导致刷新组刷新失败的物...   下一篇: ORA-600(ktsircinfo_num1)错误
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常见错...
·ORA-600(ktsircinfo_num1)错误
·Oracle10201在Enterprise Linux ...
·表异常增大的bug
·数据库升级造成的X_$BH状态异常问...
·9i上使用CONNECT BY访问DUAL表的...
·使用SQL判断一个数是否质数
·缺少GROUP BY表达式可以顺利执行...
·临时表产生REDO过多的bug
·ORA-21561错误
·缺少GROUP BY表达式可以顺利执行...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接