分区索引笔记(四)--分区索引什么时候会失效及处理
分区索引笔记(四)--分区索引什么时候会失效及处理分区索引笔记(三)--全局分区索引http://www.zzzyk.com/database/201308/238740.html分区表中 local 索引的维护会在oracle 操作表分区的时候自动进行,需要注意的是global 索引,当global索引所在表执行alter table 涉及下列操作时,会导至该索引失效,需要重新建立:Ø ADD PARTITION | SUBPARTITIONØ COALESCE PARTITION | SUBPARTITIONØ DROP PARTITION | SUBPARTITIONØ EXCHANGE PARTITION | SUBPARTITIONØ MERGE PARTITION | SUBPARTITIONØ MOVE PARTITION | SUBPARTITIONØ SPLIT PARTITION | SUBPARTITIONØ TRUNCATE PARTITION | SUBPARTITION因此,建议用户在执行上述操作sql 语句后附加update indexes 子句,oracle即会自动维护全局索引,当然,需要注意这中间有一个平衡,你要平衡操作ddl 的时间和重建索引哪个时间更少,以决定是否需要附加updateindexes 子句。-----------------------------------------总结: ----不管是全局索引和本地索引,只要出现了数据移动,那么索引或分区索引都会失效1、执行alter table add partition 时未指定update indexes 子句:a. 如果是range/list分区,其local 索引和global 索引不会受影响;b. 如果是hash 分区,新加分区及有数据移动的分区的local 索引和global索引会被置为unuseable,需要重新编译。2、在执行drop partition时如果没有指定update indexes 子句:会导致glocal索引的失效,对于local索引,删除分区时对应的索引分区会被同时删除,且它分区的local索引不会受到影响。3、在执行split partition/subpartition 时,如果没有指定update indexes 子句:都会造成local 和global 索引的失效。不过如果你split partition/subpartition 的是个空分区,或者没有触发任何数据移动或变化,那么即使不加update indexes,也不会影响到索引。当然,保险起见,建议你还是执行完之后,查询一下数据字典,确认一下当前索引的状态。----------------------------------------------------------------------下面简单测试一下:1. 创建一个Range分区表:CREATE TABLE DFMS.TEST04PARTITION BY RANGE(OBJECT_ID)(PARTITION P1 VALUES LESS THAN (2000)TABLESPACE LOG_DATA,PARTITION P2 VALUES LESS THAN (8000)TABLESPACE LOG_DATA,PARTITION P3 VALUES LESS THAN (20000)TABLESPACE LOG_DATA,PARTITION P4 VALUES LESS THAN (40000)TABLESPACE LOG_DATA,PARTITION PMAX VALUES LESS THAN (MAXVALUE)TABLESPACE LOG_DATA)ASSELECT * FROM DBA_OBJECTS ;2. 建立一个PK, 同时生成global index:alter table DFMS.TEST04 add constraint pk_id primary key(object_id);建立一个local index :CREATE INDEX DFMS.IDX1_TEST04 ON DFMS.TEST04 (OBJECT_NAME) LOCAL ;3. 我们通过dba_indexes视图查看global index的状态发现是valid :select index_name, status, last_易做图yzed,partitioned from dba_indexes where index_name='PK_ID' ;本地索引local index通过dba_indexes查看的状态是N/A, 需要通过dba_ind_partitions来查看,可以看到每个索引分区都是USABLE状态。而通过DBA_PART_INDEXES可以看到这个本地分区索引的整体状态。select * from dba_ind_partitions where index_name='IDX1_TEST04' ;select * from dba_indexes where index_name='IDX1_TEST04' ;select * from DBA_PART_INDEXES where index_name='IDX1_TEST04' ;4. 因为存在maxvalue,我们先测试split对全局及本地索引的影响 .4.1 新分区中都有数据的情况alter table test04 split partition pmax at (80000) into(partition p5 tablespace log_data ,partition pmax tablespace log_data);我们从table的脚本可以看出pmax被分成p5和pmax两部分:....PARTITION P5 VALUES LESS THAN (80000),PARTITION PMAX VALUES LESS THAN (MAXVALUE) ;.....显然由于select max(object_id) from TEST04 的行数是101769,split后旧分区中符合less than 80000的留在了第一个分区p5,其他的都存在了第二个分区(新的pmax分区)。我们查询global index及local index的状态:select index_name, status, last_易做图yzed,partitionedfrom 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_易做图yzed,partitionedfrom 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_易做图yzed,partitioned from dba_indexes where index_name='PK_ID' ;select * from dba_ind_partitions where index_name='IDX1_TEST04' ;备注:在split pmax分区时新的分区名称可以随便起(不一定含有pmax),比如上面的可以使用p6,p7, 只是上一个:oracle之监听保护
下一个:分区索引笔记(三)--全局分区索引