日期:2014-05-16 浏览次数:20782 次
前文说到:交换分区导致索引失效-----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
-------------