日期:2014-05-17  浏览次数:21202 次

对分区表进行了 删除,添加,分割,合并 之后索引失效了

搞搞分区表,
新建的分区表之后,不同分区分别建立 局部索引

据说 局部索引的好处就在于不容易失效

结果经过了 分割合并之后
索引还是失效了

不过这个也可能有我自己的原因
因为中间 进行多次分割 和合并
且 中间分割的时候 分区的名字 发生了改变,可能这是导致 索引无效的一个因素

总之 我通过原来的索引所在列进行 查询的时候,
oracle 还是走的全表, 
分析表 分析索引,都是提示 索引或者分区 不可用

analyze index part_ind compute statistics;
analyze index part_ind compute statistics
*
ERROR at line 1:
ORA-01502: index 'SCOTT.PART_IND' or partition of such index is in unusable
state


这个时候, 大概就是 rebuild 一下索引了

不过还是想知道 如何避免或者减少类似的索引失效


------解决方案--------------------
导致索引失效的原因有哪些?原因:当某些操作导致数据的rowid改变,索引就会完全失效。
那什么时候会导致rowid改变使得索引unuseable或者invalid呢?
一般普通表在在如下3个情况下可以使index unusable
1)move 【alter table move】【alter table t02 move tablespace tbs01;】
2)sqlldr 【sqlldr ( parallel or direct )append 】【sqlldr direct=y + 主键重复】
3)手动alter index unusable
对分区表,又要分local index和globa index来说
1)首先上面的导致普通表上的索引失效的原因对分区表也同样适用.
2)对local index在exchange without including indexes的时候也会unusable
3)global index在partition mt的时候会导致unusable[除非加上update global indexes]
以下为引用:
1.导致的原因: 
在SQL*LOADER 加载过程中会维护索引,由于数据量比较大,在SQL*LOADER 加载过程中出现异常情况,导致ORACLE 来不及维护索引,导致索引处于失效状态,影响查询和加载。 异常情况主要有:在加载过程中杀掉SQL*LOADER 进程,重启,表空间不够等。 
2. global索引,当global 索引所在表执行alter table 涉及下列操作时,会导至该索引失效:

? ADD PARTITION | SUBPARTITION

? COALESCE PARTITION | SUBPARTITION

? DROP PARTITION | SUBPARTITION

? EXCHANGE PARTITION | SUBPARTITION

? MERGE PARTITION | SUBPARTITION

? MOVE PARTITION | SUBPARTITION

? SPLIT PARTITION | SUBPARTITION

? TRUNCATE PARTITION | SUBPARTITION

因此,建议用户在执行上述操作sql 语句后附加update indexes 子句,oracle 即会自动维护全局索引。

3. 执行alter table 时未指定update indexes 子句:

如果是range/list 分区,其local 索引和global 索引不会受影响;

如果是hash 分区,新加分区及有数据移动的分区的local 索引和glocal 索引会被置为unuseable,

需要重新编译

对于分区表中索引失效要重建索引

select 'alter index '||t.index_name||' rebuild partition '||t.partition_name from user_ind_partitions t where t.index_name='IDX_PART2' and t.status='unusable'

查出来后,在命令窗口执行。查出来的语句就可以了。


------解决方案--------------------
如果分区中有数据,对分区进行的合并/拆分操作会导致局部分区索引不可用。
可以操作之后重建索引,也可以在操作时使用update indexes子句。
例如:
SQL code
tony@ORA11GR2> alter table t split partition part_2 at (2)  
  2  into (partition part_1 tablespace ts1, partition part_2 tablespace ts2)  
  3  update indexes;  
Table altered.