2013年(350)
分类: Mysql/postgreSQL
2013-04-25 10:46:43
从本节开始,介绍索引分区的操作~~
1、增加索引分区(Adding Index Partitions)
从语法上来讲,增加索引分区与增加表分区没有什么实际性差别,将table换成index即可:
Alter index idxname add partition ptname tbs_clause;
需要注意一点add partition只能用于hash的global索引(如果你想为range类型的索引增加分区,不要用add,split也许能帮你实际你的需求),并且add partition无法新增local索引分区,因为local分区是由索引所在基表来维护的。
下面举个操作的例子,还记的我们前面演示创建hash分区的时候创建的索引吗,这里就以它为例吧:
JSSWEB> select partition_name,tablespace_name from user_ind_partitions
2 where index_name='IDX_PART_HASH_ID';
PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYS_P113 TBSPART01
SYS_P114 TBSPART02
SYS_P115 TBSPART03
JSSWEB> alter index idx_part_hash_id add partition i_hash_id_p4 tablespace tbspart04;
索引已更改。
JSSWEB> select partition_name,tablespace_name from user_ind_partitions
2 where index_name='IDX_PART_HASH_ID';
PARTITION_NAME TABLESPACE_NAME
------------------------------ ------------------------------
I_HASH_ID_P4 TBSPART04
SYS_P113 TBSPART01
SYS_P114 TBSPART02
SYS_P115 TBSPART03
看看,就是这么简单。
2、删除索引分区(Dropping Index Partitions)
Drop partition只能操作global索引的range分区,语法也很简单:
Alter index idxname drop partition ptname;
看起来很简单对吧,但是,需要注意,索引必须拥有一个maxvalue的分区,该分区无法删除。
另外,如果删除的索引分区中包含数据,分区被删除后,会造成相邻的higher分区失效,需要手工编译!这个其实很容易理解,索引中数据都是经过排序的,我们drop partition删除的只是分区,但其对应的索引数据还需要有地儿存在行啊(不然索引启不就不准确了),于是就只好存储到比它更高区间值的索引区分里去了,那个分区莫名其妙多了数据,自然状态就为不可用了。
举个例子:
JSSWEB> select partition_name,high_value,tablespace_name,status from user_ind_partitions
2 where index_name='IDX_PART_RANGE_ID';
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME STATUS
-------------------- --------------- -------------------- --------
I_RANGE_P1 10 TBSPART01 USABLE
I_RANGE_P2 40 TBSPART02 USABLE
I_RANGE_PMAX MAXVALUE TBSPART03 USABLE
向表中插入几条记录:
JSSWEB> insert into t_partition_range values (8,'a');
已创建 1 行。
JSSWEB> insert into t_partition_range values (9,'b');
已创建 1 行。
JSSWEB> commit;
提交完成。
执行删除操作
JSSWEB> alter index idx_part_range_id drop partition i_range_p1;
索引已更改。
JSSWEB> select partition_name,high_value,tablespace_name,status from user_ind_partitions
2 where index_name='IDX_PART_RANGE_ID';
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME STATUS
-------------------- --------------- -------------------- --------
I_RANGE_P2 40 TBSPART02 UNUSABLE
I_RANGE_PMAX MAXVALUE TBSPART03 USABLE
于是,i_range_p2分区就unusable了,继续往下看吧,后面要讲如何重编译索引分区了。