一般普通表在在如下3個情況下可以使index unusable
1)move
2)sqlldr [有時]--關於sqlldr專門測試學些
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.建立測試表:
create table idx_status_tb(
id number,
name varchar2(32),
type number(2),
idx1 number(2),
idx2 number(2)
);
2.建立唯一索引
create unique index idx_tb on idx_status_tb(idx1,idx2);
3.查看索引狀態
select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDX_TB';
4.插入樣本資料
insert into idx_status_tb values (1, 'first', 01, 01, 01);
5.手工將索引置為無效
alter index idx_tb unusable;
6.再次插入資料到表中
insert into idx_status_tb values (2, 'sec', 01, 02, 01);
提示:ORA-01502錯誤(ORA-01502: 索引 'FIONA.IDX_TB' 或這類索引的分區處於不可用狀態)
解決方案:1)重建索引:alter index idx_tb rebuild;
再次插入資料到表中,資料正常插入
再次將索引改為無效狀態,通過修改參數的方式來更改問題
通過設定alter session set skip_unusable_indexes=true;
修改之後再次插入資料到表中發現仍然無法插入;因此索引失效的解決辦法目前我所知道的只能是重建索引;
索引失效的另一種情況
1.將表遷移到其他資料表空間
alter table idx_status_tb move tablespace TESTTB;
2.查看索引狀態
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name ='IDX_TB';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_TB NORMAL MYTBS TABLE UNUSABLE
3.重建索引
alter index idx_tb rebuild;
4.查看索引狀態,此時索引已經生效,但索引所在資料表空間仍未為之前的MYTBS並沒有跟隨表的遷移而移動
select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name ='IDX_TB';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_TB NORMAL MYTBS TABLE VALID
5.如果要將索引也遷移到新的資料表空間需要怎麼做呢
alter index idx_tb rebuild tablespace TESTTBS;
6.再次查看索引狀態;此時索引也存在於TESTTBS資料表空間中
select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name ='IDX_TB';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
IDX_TB NORMAL TESTTBS TABLE VALID