关于索引失效的一点学习

一、什么是索引失效

    索引状态为unusable,形同虚设;

二、什么情况下会失效

    (1)表空间的移动:move一个表到另外一个表空间时,索引不会跟着一起move,索引会处于unusable的状态。

        移动表的语法:alter table table_name move tablespace tablespacename

         alter table SMS.user_INFO move tablespace education

         /

         select *
         from SMS.user_INFO
         where mobile='13515151515';

         -------本来此时user_info表上有一个mobile的索引,而此时却没有走,查看数据字典得知为unusable的状态;

     

    (2)修改分区表的全局索引之后,没有进行update indexes.

         truncate分区表的一个分区的时候,alter table tablename truncate partition partitionname update indexes.此时并没有update indexes.之后索引也会处于不可用状态。

    (3)总结一点:以上两个都是alter的DDL之后,会带来索引失效。。。。

    

    (4)分区索引的问题:局部分区索引的问题,一个分区删除之后,不影响其他分区上的局部分区索引。

         时间问题,不再加测试。

三、解决办法

    A、对于(1)的解决办法,重建索引:

    alter index  sms.IDX_MOBILE  rebuild  tablespace indx

    ----重建索引,并更换表空间;(操作过程中会锁表)

    相关语法:

    alter index  sms.IDX_MOBILE  rebuild

    ----(操作过程中会锁表)

    alter index  sms.IDX_MOBILE  rebuild online

    ----在线重建索引 不影响dml。

   

   

    B、对于(2)就不能用A方法,A方法对于(2)是治标不治本;

    对于(2)应该是以下两种任选其一

    a.加上update indexes

    b.使用local关键字改用局部分区索引;

    global索引如何转换为分区索引?

    在线重定义然后rename索引的名字为正常名字、先删除再重建。倾向于前者;

 中间表    

CREATE TABLE RST.user_info__NEW
(
    MONTH     CHAR(6)       NULL,
    para2 NUMBER(9)     NULL,
    id  NUMBER(8)     NULL,
    para4 CHAR(11)      NULL,
    para5 NUMBER(8)     NULL
)
TABLESPACE EDUCATION
NOLOGGING
PCTFREE 0
PCTUSED 0
INITRANS 5
MAXTRANS 255
STORAGE(BUFFER_POOL DEFAULT)
NOPARALLEL
NOCACHE
PARTITION BY RANGE(MONTH)
(PARTITION PART1009 VALUES LESS THAN ('201010')
    COMPRESS,
 PARTITION PART1010 VALUES LESS THAN ('201011')
    COMPRESS,
 PARTITION PART1011 VALUES LESS THAN ('201012')
    COMPRESS,
 PARTITION PART1012 VALUES LESS THAN ('201101')
    COMPRESS,
 PARTITION PARTMAX VALUES LESS THAN (MAXVALUE)
    COMPRESS)
/

CREATE INDEX RST.IDX2_CONU
    ON RST.user_info_NEW(ID)
TABLESPACE INDX
NOLOGGING
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE(BUFFER_POOL DEFAULT)
NOPARALLEL
LOCAL
(PARTITION PART1009 ,
 PARTITION PART1010 ,
 PARTITION PART1011 ,
 PARTITION PART1012 ,
 PARTITION PARTMAX )
NOCOMPRESS

①能否进行重定义

BEGIN
 DBMS_REDEFINITION.CAN_REDEF_TABLE('rst','user_info',2);
END;

②开始重定义
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('rst','user_info','user_info_new',NULL,2);
END;

③同步数据

BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE ('rst','user_info','user_info_new');
END;

④完成重定义
BEGIN
 DBMS_REDEFINITION.FINISH_REDEF_TABLE('rst','user_info','user_info_new');
END;

如果出现问题停止重定义

begin
  dbms_redefinition.abort_redef_table('RST','user_info','user_info_new','PART1009');
END;

/

begin
  dbms_redefinition.abort_redef_table('RST','user_info','user_info_new');
END;

---then 索引变成了局部分区索引。然后rename以下就可以了 

四、待研究的问题

   索引失效的根源在哪里,就需要好好研究索引、索引的维护、如何查找数据的 如何存储的。。。。

原文地址:https://www.cnblogs.com/gracejiang/p/5890462.html