2013年(350)
分类: Mysql/postgreSQL
2013-04-25 10:45:00
1、分隔分区(Split Partition)
如果你对我们前面讲到过的merge partition还有印象的话,那么学习Split partition也不会遇到什么障碍,split partition的功能与merge partition功能正好相反:后者是将两个全区合并成一个,前者则是将一个分区分隔成两个。其用途非常广泛,比如通常见你发现某个分区过大,你就可以通过这种方式将该分区分解成多个小分区,对我而言最常用到的,当然还是split maxvalue/default的分区。
该命令的语法针对不同分区会有不同的形式,
l For range partition:alter table tbname split partition ptname at (value) into (partition newpt1 tbs_clause,partition newpt2 tbs_clause);
l For list partition : alter table tbname split partition ptname values (v1,v2...vn) into (partition newpt1 tbs_clause,partition newpt2 tbs_clause);
上述两项,如果是操作子分区,则将partition关键字换成subpartition即可。旧分区中符合新定义值的记录会存储到指定的第一个分区中,其它的记录存储到第二个分区。
例如,range分区的示例:
JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions
2 where table_name='T_PARTITION_RANGE';
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
-------------------- ---------------------------------------- --------------------
T_RANGE_P3 30 TBSPART03
T_RANGE_PMAX MAXVALUE TBSPART04
T_RANGE_P1 20 TBSPART02
我们将t_range_p1分区分隔到两个分区中,小于10的存放新建分区t_range_p1(已非原t_range_p1鸟,只是名称相同而已),其它数据存入t_range_p2分区:
JSSWEB> alter table t_partition_range split partition t_range_p1 at (10) into
2 (partition t_range_p1 tablespace tbspart01,
3 partition t_range_p2 tablespace tbspart02);
表已更改。
JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions
2 where table_name='T_PARTITION_RANGE';
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
-------------------- ---------------------------------------- --------------------
T_RANGE_P3 30 TBSPART03
T_RANGE_PMAX MAXVALUE TBSPART04
T_RANGE_P1 10 TBSPART01
T_RANGE_P2 20 TBSPART02
再来演示一个list分区的例子:
JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions
2 where table_name='T_PARTITION_LIST';
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
-------------------- ---------------------------------------- --------------------
T_LIST_P1 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 33 TBSPART01
T_LIST_P2 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, TBSPART02
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
T_LIST_PD default TBSPART04
我们将t_list_p2分区中分区值是2打头的存储到t_list_p3分区中,其它值存储到t_list_p2分区:
JSSWEB> alter table t_partition_list split partition t_list_p2 values
2 (20,21,22,23,24,25,26,27,28,29) into
3 (partition t_list_p3 tablespace tbspart03,
4 partition t_list_p2);
表已更改。
JSSWEB> select partition_name,high_value,tablespace_name from user_tab_partitions
2 where table_name='T_PARTITION_LIST';
PARTITION_NAME HIGH_VALUE TABLESPACE_NAME
-------------------- ---------------------------------------- --------------------
T_LIST_P1 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 33 TBSPART01
T_LIST_P2 30, 11, 12, 13, 14, 15, 16, 17, 18, 19 TBSPART02
T_LIST_PD default TBSPART04
T_LIST_P3 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 TBSPART03
提示:
l split partition/subpartition不能用于hash分区或hash子分区(hash的话,直接用add partition就好了)
l split partition/subpartition视被分隔的分区数据量多少,可能需要花费不小的代价,相当于该分区数据的全扫描,我们也许可以形容为:full partition scan:),除非:
n Split后的两个分区中,至少有一个是空的,并且非空的那个分区的存储属性与split前的存储属性完全相同
n 如果split的分区包含lob字段,split后非空的那个分区中该字段的存储属性也必须与split前的存储属性完全相同。
这种情况下的split partition/subpartition也会非常高效,会自动进行优化,此时的分区操作类似于add partition。
l 通常情况下,如果在执行split partition/subpartition时,如果没有指定update indexes子句,都会造成local和global索引的失效。注意,我们说的是通常,如果你split partition/subpartition的是个空分区,或者没有触发任何数据移动或变化,那么即使不加update indexes,也不会影响到索引。当然,保险起见,建议你还是执行完之后,查询一下数据字典,确认一下当前索引的状态。
=====================================
查看前面的连载: