日期:2014-05-16 浏览次数:20505 次
前文说到:交换分区导致索引失效-----local index,本次总结下:交换分区导致索引失效-----global index
?
测试环境:
10.1.0.2.0
Window server 2003
?
1.概念篇
?
交换分区:所谓的交换分区就是分区表和分区表之间,或者表与分区表之间的数据互相迁移。
global index:即全局分区索引,此索引的分区方式和完全不同于其所在表的分区方式,相当于对索引单独分区,完全不同于其所在表的分区机制,缺点:不易维护。 全局分区索引只按范围或者散列hash分区,本例中hash分区是10g以后才支持的,当然你可以指定其他的分区方式。
?
2.初始化脚本
test@ORCL> create table t_partition (id number,name varchar2(50)) 2 partition by range(id)( 3 partition p1 values less than (10) , 4 partition p2 values less than (20) , 5 partition p3 values less than (30) , 6 partition pmax values less than (maxvalue) 7 ); 表已创建。 test@ORCL>alter table t_partition add constraint pk_t_partition primary key (id); 表已更改。 test@ORCL>create index idx_glb_par_id 2 on t_partition(name) 3 global 4 partition by hash(name) 5 ( 6 partition p1_glb, 7 partition p2_glb, 8 partition p3_glb 9 ); 索引已创建。 test@ORCL> create table t_no_partition (id number,name varchar2(50)); 表已创建。 test@ORCL> alter table t_no_partition add constraint pk_t_no_partition primary key (id); 表已更改。 test@ORCL>insert into t_no_partition values(11,'11'); 已创建 1 行。 test@ORCL>insert into t_no_partition values(12,'ddd'); 已创建 1 行。 test@ORCL>insert into t_no_partition values(13,'13dsa'); 已创建 1 行。 test@ORCL>commit; 提交完成。 test@ORCL>select partition_name, status from user_ind_partitions; PARTITION_NAME STATUS ------------------------------ -------- P3_GLB USABLE P2_GLB USABLE P1_GLB USABLE test@ORCL>select * from t_no_partition; ID NAME ---------- ------------------------------ 11 11 12 ddd 13 13dsa test@ORCL>select * from t_partition; 未选定行
3. 交换分区:
?
test@ORCL>alter table t_partition exchange partition p2 2 with table t_no_partition; 表已更改。 test@ORCL>select * from t_no_partition; 未选定行 test@ORCL>select * from t_partition; ID NAME ---------- ------------------------------ 11 11 12 ddd 13 13dsa test@ORCL>select partition_name, status from user_ind_partitions; PARTITION_NAME STATUS ------------------------------ -------- P3_GLB UNUSABLE P2_GLB UNUSABLE P1_GLB UNUSABLE
?
数据交换成功了,但是global index的所有分区索引都失效了。
?
4.解决办法:加上UPDATE INDEXES
。
test@ORCL> create table t_partition (id number,name varchar2(50)) 2 partition by range(id)( 3 partition p1 values less than (10) , 4 partition p2 values less than (20) , 5 partition p3 values less than (30) , 6 partition pmax values less than (maxvalue) 7 ); 表已创建。 test@ORCL>alter table t_partition add constraint pk_t_partition primary key (id); 表已更改。 test@ORCL>create index idx_glb_par_id 2 on t_partition(name) 3 global 4 partition by hash(name) 5 ( 6 partition p1_glb, 7 partition p2_glb, 8 partition p3_glb 9 ); 索引已创建。 test@ORCL> create table t_no_partition (id number,name varchar2(50)); 表已创建。 test@ORCL>alter table t_no_partition add constraint pk_t_no_partition primary key (id); 表已更改。 test@ORCL>insert into t_no_partition values(11,'11'); 已创建 1 行。 test@ORCL>insert into t_no_partition values(12,'ddd'); 已创建 1 行。 test@ORCL>insert into t_no_partition values(13,'13dsa'); 已创建 1 行。 test@ORCL>commit; 提交完成。 test@ORCL>select partition_name, status from user_ind_partitions; PARTITION_NAME STATUS -------------