分区索引笔记(四)--分区索引什么时候会失效及处理(二)
ndex_name, status, last_analyzed,partitioned
from dba_indexes where index_name='PK_ID' ;
这里显然触发了数据的移动,global index索引状态变成UNUSABLE.
select * from dba_ind_partitions where index_name='IDX1_TEST04' ;
因为新split出来的分区(这里指p5)中有数据,原pmax中的数据被拆分到新分区p5及新的pmax中,发现p1,p2,p3,p4 对应的本地索引仍然是USABLE,而新的p5及新pmax对应的本地索引都是UNUSABLE.
OK, 我们对global index及p5,pmax对应的本地分区索引进行rebuild :
alter index PK_ID rebuild online;
然后查询发现global index变成valid :
select index_name, status, last_analyzed,partitioned
from dba_indexes where index_name='PK_ID' ;
alter index IDX1_TEST04 rebuild partition p5 online;
alter index IDX1_TEST04 rebuild partition pmax online;
执行之后查询:
select * from dba_ind_partitions where index_name='IDX1_TEST04' ;
可以看到两个索引分区p5及pmax状态都变成USABLE .
4.2 新分区中有一个没有数据
TEST04 的行数是101769,那么我们将p6新分区设置为110000,那么pmax分区显然就没有数据了。(新分区包含了所有PMAX分区的数据)
alter table test04 split partition pmax at (110000) into ----这里注意一下,新加一个分区,但数据算没有移动的
(partition p6 tablespace log_data , partition pmax tablespace log_data);
查看global index及local index可以看到全局索引及每个本地索引分区都是USABLE, 这是因为没有触发数据移动。
select index_name, status, last_analyzed,partitioned from dba_indexes where index_name='PK_ID' ;
select * from dba_ind_partitions where index_name='IDX1_TEST04' ;
备注:在split pmax分区时新的分区名称可以随便起(不一定含有pmax),比如上面的可以使用p6,p7, 只是p6会遵循less than 110000, 而第二个分区p7仍然是less than maxvalue.
还有因为这里是表空间没有变化,如果非空的分区存储属性和原来的存储属性不一样,也会发生数据移动,也会导致索引失效。
5. 测试drop partition对全局及本地索引的影响。
对test04表的最后一个没有数据的pmax分区进行删除动作。
alter table test04 drop partition pmax ;
因为删除的分区没有数据,所以不涉及数据变化,所以对全局及本地所以都没有影响。
假设我们要删除有数据的部分,既不保留分区也不保留数据,那么本地索引不会受到影响,global index会失效。
alter table test04 drop partition p6 ;
查询
select * from dba_indexes where index_name='PK_ID' ;
全局索引失效,状态变成UNUSABLE .
select * from dba_ind_partitions where index_name='IDX1_TEST04' ;
本地索引(其他分区)状态不变,为USABLE .
6. 测试add partition 对全局索引和本地索引的影响。
alter table test04 add partition p6 values less than (120000) ;
查询状态:
select * from dba_indexes where index_name='PK_ID' ;
select * from dba_ind_partitions where index_name='IDX1_TEST04' ;
发现Range分区,加入分区对于全局及本地索引都没有影响。
同样测试list分区,也可以知道加入分区对于全局及本地索引都没有影响。这主要是因为没有触发数据的移动。
6.1 对于Hash分区,由于add parittion会发生数据分布平衡的I/O操作,数据会发生移动,所以本地分区索引及全局索引都会置为UNUSABLE, 需rebuild.下面做简单测试:
CREATE TABLE DFMS.TEST05
PARTITION BY HASH (OBJECT_ID)
PARTITIONS 8
STORE IN (LOG_DATA)
AS SELECT * FROM DBA_OBJECTS ;
加入global及local index .
alter table DFMS.TEST05 add constraint pk_test05_id primary key(object_id);
CREATE INDEX DFMS.IDX1_TEST05 ON DFMS.TEST05 (OBJECT_NAME) LOCAL ;
加入新分区:
alter table test05 add partition ;
查询
select * from dba_indexes where index_name='PK_TEST05_ID' ;
select * from dba_ind_partitions where index_name='IDX1_TEST05' ;
发现global index是UNUSABLE状态,本地分区索引中的第一个和最后一个分区的本地分区索引是UNUSABLE状态,其它是USABLE. 显然因为数据从第一个分区被拆分到了新的hasn分区,所以这两个分区中的数据发生了移动,导致了本地分区索引的失效,因为有数据行的移动,当然global index也变成了失效状态(UNUSABLE) .
SQL> select index_owner