Oracle移动表对索引的影响

kokuma 2016-11-22

这里主要测试移动表从一个表空间到另一个表空间或者在同同一个表空间做表移动操作对索引的影响。测试中表明:表的移动(move)会直接导致该表中的索引失效,通过重建索引,重新让索引恢复有效可用的状态。以下是简单的测试过程。

---创建测试表:

--查看表结构:

linuxidc@PROD>desc mytest

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 NAME                                              VARCHAR2(6)

 CREATED                                            DATE
 

--添加字段:

linuxidc@PROD>alter table mytest add id number(2);

Table altered.

 

--查看表结构:

linuxidc@PROD>desc mytest

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 NAME                                              VARCHAR2(6)

 CREATED                                            DATE

 ID                                                NUMBER(2)
 

---创建索引:

linuxidc@PROD>create index ind_mytest on mytest(id);

Index created.

#索引添加成功。

 

--查看表结构:

linuxidc@PROD>desc mytest

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 NAME                                              VARCHAR2(6)

 CREATED                                            DATE

 ID                                                NUMBER(2)

 

--查看索引:

linuxidc@PROD>select index_name,table_name,tablespace_name,status

  2  from user_indexes; 

INDEX_NAME      TABLE_NAME      TABLESPACE_NAME STATUS

--------------- --------------- --------------- --------

PK_COL1_COL2    T_IOT          MYSPACE        VALID

IDX_T4          T4              USERS          VALID

IDX_T3          T3              USERS          VALID

IND_MYTEST      MYTEST          USERS          VALID

 

---查看表mytest所在的空间:

linuxidc@PROD>select table_name,tablespace_name

  2  from user_tables

  3  where table_name ='MYTEST';

TABLE_NAME                    TABLESPACE_NAME

------------------------------ ------------------------------

MYTEST                        MYSPACE
 

---把表移动到另外一个表空间:

linuxidc@PROD>alter table mytest move tablespace myspace;

Table altered.

#mytest表已经移动。

 

---此时查看表mytest中的索引状态:

linuxidc@PROD>select index_name,table_name,tablespace_name,status

  2  from user_indexes;

INDEX_NAME      TABLE_NAME      TABLESPACE_NAME STATUS

--------------- --------------- --------------- --------

PK_COL1_COL2    T_IOT          MYSPACE        VALID

IDX_T4          T4              USERS          VALID

IDX_T3          T3              USERS          VALID

IND_MYTEST      MYTEST          USERS          UNUSABLE

#表mytest中的索引已经失效。

 

---重建索引:

linuxidc@PROD>alter index ind_mytest rebuild;

Index altered.

#索引已经重建。

---再次查看索引的信息:

linuxidc@PROD>select index_name,table_name,tablespace_name,status

  2  from user_indexes;

INDEX_NAME      TABLE_NAME      TABLESPACE_NAME STATUS

--------------- --------------- --------------- --------

PK_COL1_COL2    T_IOT          MYSPACE        VALID

IDX_T4          T4              USERS          VALID

IDX_T3          T3              USERS          VALID

IND_MYTEST      MYTEST          USERS          VALID

#索引已经重建,默认情况下索引存放在users表空间里。

 

----移动索引存放的表空间:

linuxidc@PROD>alter table mytest move tablespace myspace;

Table altered.

linuxidc@PROD>select index_name,table_name,tablespace_name,status

  2  from user_indexes;

INDEX_NAME      TABLE_NAME      TABLESPACE_NAME STATUS

--------------- --------------- --------------- --------

PK_COL1_COL2    T_IOT          MYSPACE        VALID

IDX_T4          T4              USERS          VALID

IDX_T3          T3              USERS          VALID

IND_MYTEST      MYTEST          USERS          UNUSABLE
 

---重建索引:

linuxidc@PROD>alter index ind_mytest rebuild tablespace myspace;

Index altered.

 

--再次查看索引的信息:

INDEX_NAME      TABLE_NAME      TABLESPACE_NAME STATUS

--------------- --------------- --------------- --------

PK_COL1_COL2    T_IOT          MYSPACE        VALID

IDX_T4          T4              USERS          VALID

IDX_T3          T3              USERS          VALID

IND_MYTEST      MYTEST          MYSPACE        VALID

#索引已经重建,并已经修改了存放的表空间。

--从上面的测试过程中,发现,移动表或者直接移动索引,都会导致该表中的索引或者移动的索引失效,通过重建rebuild让索引重新正常可用。

相关推荐