Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1239600
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-25 10:45:00

1、分隔分区(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分区的示例:

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

提示:

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

split partition/subpartition视被分隔的分区数据量多少,可能需要花费不小的代价,相当于该分区数据的全扫描,我们也许可以形容为:full partition scan:),除非:

Split后的两个分区中,至少有一个是空的,并且非空的那个分区的存储属性与split前的存储属性完全相同

如果split的分区包含lob字段,split后非空的那个分区中该字段的存储属性也必须与split前的存储属性完全相同。

这种情况下的split partition/subpartition也会非常高效,会自动进行优化,此时的分区操作类似于add partition。

通常情况下,如果在执行split partition/subpartition时,如果没有指定update indexes子句,都会造成local和global索引的失效。注意,我们说的是通常,如果你split partition/subpartition的是个空分区,或者没有触发任何数据移动或变化,那么即使不加update indexes,也不会影响到索引。当然,保险起见,建议你还是执行完之后,查询一下数据字典,确认一下当前索引的状态。

=====================================

查看前面的连载:

(12)--修改list表分区

(11)--合并表分区

(10)--交换表分区

(9)--删除表分区

(8)--增加和收缩表分区

(7)--怎样管理

阅读(809) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~