合并、分隔表分区!

来源:互联网 发布:产业链大数据包含 编辑:程序博客网 时间:2024/05/22 04:54
合并两个分区成一个,适用于除hash之外的其它所有分区形式(hash分区有coalesce partition的嘛,前头刚刚讲过)。
语法很简单:alter table tbname merge partitions/subpartitions pt1,pt2 into partition/subpartition pt3;
同样也支持update indexes子句以避免单独执行造成索引失效的问题。
需要注意一点,要合并的两个分区必须是连续的,这点是由分区本身的特性所决定的,如例:
SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_RANGE_P1                     10              TBSPART01T_RANGE_P2                     20              TBSPART02T_RANGE_P3                     30              TBSPART03T_RANGE_PMAX                   MAXVALUE        TBSPART04SQL> alter table t_partition_range merge partitions t_range_p1,t_range_p2 into partition t_range_pnew;表已更改。SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_RANGE_P3                     30              TBSPART03T_RANGE_PMAX                   MAXVALUE        TBSPART04T_RANGE_PNEW                   20              SYSTEMSQL> alter table t_partition_range merge partitions T_RANGE_PNEW,T_RANGE_P3 into partition t_range_new tablespace tbspart03;表已更改。SQL> select PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from user_tab_partitions where TABLE_NAME = 'T_PARTITION_RANGE';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_RANGE_NEW                    30              TBSPART03T_RANGE_PMAX                   MAXVALUE        TBSPART04SQL> select * from t_partition_range partition(t_range_new);        ID NAME---------- --------------------------------------------------        11 a        12 b        13 c         8 g

可见,合并分区操作不会造成数据丢失,另外如果你想为新分区指定属性的话,在语句末尾处增加存储属性即可(如果不指定,则新分区默认继续表的存储属性)。注意,merge分区操作与coalesce分区操作一样,视被合并的分区数据量多少,都可能涉及到大量的IO操作。其它合并组合分区的操作与上类似,如果要合并组合分区,注意关键字是merge subpartitions,这里就不做演示了。

 

分隔分区(Split Partition)
如果你对我们前面讲到过的merge partition还有印象的话,那么学习Split partition也不会遇到什么障碍,split partition的功能与merge partition功能正好相反:后者是将两个全区合并成一个,前者则是将一个分区分隔成两个。其用途非常广泛,比如通常见你发现某个分区过大,你就可以通过这种方式将该分区分解成多个小分区,对我而言最常用到的,当然还是split maxvalue/default的分区。

该命令的语法针对不同分区会有不同的形式,
 For range partition:alter table tbname split partition ptname at (value) into (partition newpt1 tbs_clause,partition newpt2 tbs_clause);
 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分区的示例。我们将t_range_new分区分隔到两个分区中,小于15的存放新建分区t_range_p1,其它数据存入t_range_p2分区:

SQL> select partition_name,high_value,tablespace_name from user_tab_partitions where table_name='T_PARTITION_RANGE';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_RANGE_NEW                    30              TBSPART03T_RANGE_PMAX                   MAXVALUE        TBSPART04SQL> alter table t_partition_range split partition T_RANGE_NEW at (15) into   2  (partition t_range_p1 tablespace tbspart01,partition t_range_p2 tablespace tbspart02);表已更改。SQL> select partition_name,high_value,tablespace_name from user_tab_partitions where table_name='T_PARTITION_RANGE';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_RANGE_P1                     15              TBSPART01T_RANGE_P2                     30              TBSPART02T_RANGE_PMAX                   MAXVALUE        TBSPART04

 

再来演示一个list分区的例子。我们将t_list_p1分区中分区值大于5的存储到t_list_p2分区中,其它值存储到t_list_p1分区:

SQL> select partition_name,high_value,tablespace_name from user_tab_partitions where table_name='T_PARTITION_LIST';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_LIST_P1                      1, 2, 3, 4, 5,  TBSPART01                               6, 7, 8, 9, 10,                                11T_LIST_PD                      default         TBSPART04SQL> alter table t_partition_list split partition t_list_p1 values  2  (6,7,8,9,10,11) into  3  (partition t_list_p2 tablespace tbspart02,  4   partition t_list_p1 tablespace tbspart01);表已更改。SQL> select partition_name,high_value,tablespace_name from user_tab_partitions where table_name='T_PARTITION_LIST';PARTITION_NAME                 HIGH_VALUE      TABLESPACE_NAME------------------------------ --------------- ------------------------------T_LIST_P2                      6, 7, 8, 9, 10, TBSPART02                                11T_LIST_P1                      1, 2, 3, 4, 5   TBSPART01T_LIST_PD                      default         TBSPART04

提示:split partition/subpartition不能用于hash分区或hash子分区(hash的话,直接用add partition就好了)。