Home  >  Article  >  Database  >  Oracle数据库索引失效

Oracle数据库索引失效

WBOY
WBOYOriginal
2016-06-07 17:00:271340browse

Oracle数据库中有一个表,用PL/SQL查看该表的索引没有被DROP掉, 但是表上的数据查询起来很慢(查询时间大概是原来的3倍),后

Oracle数据库中有一个表,用PL/SQL查看该表的索引没有被DROP掉,,   但是表上的数据查询起来很慢(查询时间大概是原来的3倍),后来重建了一下索引就好了,   请问这是为什么,   在什么情况下会出现类似的索引丢失的情况?

可能是你的表经常被更新,碎片太多,索引占用空间太大,优化器觉得没有必要用索引了就直接全表扫描了啊,你重新建立索引,就整理了碎片了啊,当然就又用索引了.

索引失效的情况很多,比如左边使用了函数 ,表没有分析 ,导致索引扫描的cost高于全表扫描,表很小 ,等等。需要具体分析。你可以根据执行计划来判断.


以下情况会导致索引失效:
1) 直接导入:
imp with SKIP_UNUSABLE_INDEXES=Y
or sqlldr with SKIP_INDEX_MAINTENANCE
 
2) 在索引维护过程中出现ORA-1652/1653错误:
sqlldr DIRECT=Y failes with ORA-1652 or 1653
 
3) 分区维护导致ROWID发生改变:
ALTER TABLE MOVE PARTITION
ALTER TABLE TRUNCATE PARTITION
ALTER TABLE SPLIT PARTITION

索引失效问题解决方法:
1)导致的原因:
     在SQL*LOADER 加载过程中会维护索引,由于数据量比较大,在SQL*LOADER 加载过程中出现异常情况,导致ORACLE 来不及维护索引,导致索引处于失效状态,影响查询和加载。
     异常情况主要有:在加载过程中杀掉SQL*LOADER 进程,重启,表空间不够等。

2)解决方法:
      重建索引
3)如何重建索引
      a) 查看索引类型
select  t1.index_name,t1.partitioned from Dba_Indexes t1 
         where t1.Table_Name=upper('CCB_COGNOS_PROD_BALANCE_AA')
索引名称                         是否分区索引 
GNOS_PROD_BALANCE_AA_N1      NO
b)非分区索引
重建索引:alter index   cin.CCB_COGNOS_PROD_BALANCE_AA_N1          rebuild Nologging
c)分区索引
          找出失效的分区索引:
select t.Index_Name, t.Partition_Name, t.Tablespace_Name, t.Status 
    from Dba_Ind_Partitions t 
   where t.Index_Name = 'CMZ_LOCAL_IDX_2'  

重建所有状态为unusable的索引
ALTER INDEX 索引名 
             REBUILD PARTITION 分区名 
             TABLESPACE 表空间名 
             NOLOGGING  

ORACLE索引失效解决方案

最近碰到这样一个问题:在PROD_PARTS表中新添加了一个索引:

create index IDX_PT_DV_ID on PROD_PARTS (DEVICE_ID);

但是在使用DEVICE_ID字段进行查询时,发现该索引并没有被利用到:

SELECT * FROM PROD_PARTS WHERE device_id =122511619;
执行计划:
TABLE ACCESS FULL

之后请教DBA后,发现是数据统计的问题,具体的解决办法是执行下面的语句:

analyze table PROD_PARTS compute statistics;
ANALYZE TABLE PROD_PARTS COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;
analyze table PROD_PARTS compute statistics for table for all indexes for all indexed columns; 

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn