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 TBSPART01 T_RANGE_P2 20 TBSPART02 T_RANGE_P3 30 TBSPART03 T_RANGE_PMAX MAXVALUE TBSPART04 SQL> 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 TBSPART03 T_RANGE_PMAX MAXVALUE TBSPART04 T_RANGE_PNEW 20 SYSTEM SQL> 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 TBSPART03 T_RANGE_PMAX MAXVALUE TBSPART04 SQL> 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 TBSPART03 T_RANGE_PMAX MAXVALUE TBSPART04 SQL> 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 TBSPART01 T_RANGE_P2 30 TBSPART02 T_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, 11 T_LIST_PD default TBSPART04 SQL> 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 11 T_LIST_P1 1, 2, 3, 4, 5 TBSPART01 T_LIST_PD default TBSPART04
提示:split partition/subpartition不能用于hash分区或hash子分区(hash的话,直接用add partition就好了)。