Oracle移动表对索引的影响
这里主要测试移动表从一个表空间到另一个表空间或者在同同一个表空间做表移动操作对索引的影响。测试中表明:表的移动(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让索引重新正常可用。