日期:2014-05-16  浏览次数:20505 次

交换分区导致索引失效-----global index篇

前文说到:交换分区导致索引失效-----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
-------------