首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Oracle频道
中国IT教育
Google
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 开发技术 >> 正文

不可用索引

select object_id,owner, object_name, object_type,created from dba_objects
where object_name = 'TEMP_JP';
OBJECT_ID   OWNER  OBJECT_NAME      OBJECT_TYPE         CREATED
---------   ------ --------------- -------------------  ---------
220845      SCOTT  TEMP_JP          TABLE               30-MAR-08

  这可能是Oracle数据库的一个漏洞。我们来查找一下在过去一小时内创建的对象:

select object_id,owner,object_name,object_type,created
from dba_objects  where created > trunc(sysdate) -1/24;
OBJECT_ID OWNER  OBJECT_NAME     OBJECT_TYPE           CREATED
--------- ------ --------------- -------------------   ---------
220846    SCOTT  TEMP_JP_IDX      INDEX                30-MAR-08
220845    SCOTT  TEMP_JP          TABLE                30-MAR-08
220847    SCOTT  TEMP_ROWIDS_JP   TABLE                30-MAR-08
select object_id, owner, object_name, object_type, created
from dba_objects where object_id in (select max(object_id) from dba_objects);
OBJECT_ID OWNER   OBJECT_NAME     OBJECT_TYPE          CREATED
--------- ------- -------------   -------------------  ---------
220847    SCOTT   TEMP_ROWIDS_JP  TABLE                30-MAR-08

  用新的RowID来查询表temp_jp:

select * from temp_jp where rowid = 'AAA16wAAMAAAC+MAAB';
      COL1 COL2
---------- --------------------
         3 SITA

  我们用新RowID能够从该表查询到数据。但是,从新RowID得到的objectid并不能检索到对象的详细信息。从这点看来,Oracle并没有使用从目前的RowID得到的objectid来检索该表的数据,而是使用fileid、blockid和行号来访问表数据。

  那么让我们来看看执行完move命令后表temp_jp的索引状态。

select index_name, status from dba_indexes where table_name='TEMP_JP';
INDEX_NAME                     STATUS
------------------------------ --------
TEMP_JP_IDX                    UNUSABLE
 set autot on exp
 select * from temp_jp where col1=3;
      COL1    COL2
----------    --------------------
         3    SITA
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=25)
   1    0   TABLE ACCESS (FULL) OF 'TEMP_JP' (TABLE) (Cost=2 Card=1 Bytes=25)


由于表temp_jp已有的索引无法使用,我们先对该表进行了一次全表扫描。正如你所想到的,表temp_jp的索引仍然存储着无效的RowID。现在,让我们来看看我们用旧的RowID能不能检索到数据。

上一页  [1] [2] [3] [4] [5] 下一页

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Oracle频道相关导航