搞搞分区表,
新建的分区表之后,不同分区分别建立 局部索引据说 局部索引的好处就在于不容易失效结果经过了 分割合并之后
索引还是失效了不过这个也可能有我自己的原因
因为中间 进行多次分割 和合并
且 中间分割的时候 分区的名字 发生了改变,可能这是导致 索引无效的一个因素总之 我通过原来的索引所在列进行 查询的时候,
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 一下索引了不过还是想知道 如何避免或者减少类似的索引失效

解决方案 »

  1.   

    导致索引失效的原因有哪些?原因:当某些操作导致数据的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'查出来后,在命令窗口执行。查出来的语句就可以了。
      

  2.   


    对于我用的分区表实际上 我就的 表空间都是 在users  这个同一个表空间上但是, 我还是觉得 这时的merge 和 split  也许会改变 数据的rowid谢谢 解答
     
      

  3.   

    如果分区中有数据,对分区进行的合并/拆分操作会导致局部分区索引不可用。
    可以操作之后重建索引,也可以在操作时使用update indexes子句。
    例如:
    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.如果分区中有数据,增加,删除,合并,拆分分区会导致全局索引不可用。
    可以操作之后重建索引,也可以在操作时使用update global indexes子句.
    例如:
    tony@ORA11GR2> alter table orders drop partition part_1  
      2  update global indexes;  
    Table altered.  
      

  4.   

    如果分区中有数据,对分区进行的合并/拆分操作会导致局部分区索引不可用。
    可以操作之后重建索引,也可以在操作时使用update indexes子句。
    例如:
    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.如果分区中有数据,增加,删除,合并,拆分分区会导致全局索引不可用。
    可以操作之后重建索引,也可以在操作时使用update global indexes子句.
    例如:
    tony@ORA11GR2> alter table orders drop partition part_1  
      2  update global indexes;  
    Table altered.