http://shuangoracle.itpub.net/post/42649/505018
一、增加表分区(add partition)
增加表分区适用于所有的分区形式,语法是:alter table tbname add partition ...
但是,对于像 list、range 这种存在范围值的分区,所要增加的分区值必须大于当前分区中的最大值(如果当前存在
maxvalue 或 default 分区,add partition 会报错,这种情况之能适用 split)。示例如下:
(1)增加 range 分区表的分区
SQL> create table t_partition_range (id number,name varchar2(50))
2 partition by range (id)(
3 partition t_range_p1 values less than (10) tablespace test1,
4 partition t_range_p2 values less than (20) tablespace test2
5 );
Table created
--增加一个分区值小于分区表中已有分区的最大列值
SQL> alter table t_partition_range add partition t_range_p3 values less than (15) tablespace test3;
alter table t_partition_range add partition t_range_p3 values less than (15) tablespace test3
ORA-14074: 分区界限必须调整为高于最后一个分区界限
--增加一个比分区表中最大列值大的分区
SQL> alter table t_partition_range add partition t_range_p3 values less than (maxvalue) tablespace test3;
Table altered
--增加一个列值比分区表中已有分区列值小的分区
SQL> alter table t_partition_range add partition t_range_p4 values less than (30) tablespace test4;
alter table t_partition_range add partition t_range_p4 values less than (30) tablespace test4
ORA-14074: 分区界限必须调整为高于最后一个分区界限
可见:对于 range 分区而言,不能添加小于最大范围值的分区。
(2)增加 list 分区表的分区
SQL> create table t_partition_list (id number,name varchar2(50))
2 partition by list (id) (
3 partition t_list_p1 values (1,2,3) tablespace test1,
4 partition t_list_p2 values (10,11,12) tablespace test2
5 );
Table created
--添加list分区表的分区
SQL> alter table t_partition_list add partition t_list_p3 values (5,6,7) tablespace test3;
Table altered
--添加list分区表的default分区
SQL> alter table t_partition_list
2 add partition t_list_p4 values (default) tablespace test4;
Table altered
--添加list分区表中小于default列值的分区
SQL> alter table t_partition_list add partition t_list_p5 values (8,9,10);
alter table t_partition_list add partition t_list_p5 values (8,9,10)
ORA-14323: 在 DEFAULT 分区已存在时无法添加分区
由上可以看出 range、list 两种分区表的区别:range 分区表不允许添加列值比已存在列值小的分区列,但是 list 分区表
允许。
(3)添加 hash 分区:
因为 hash 分区表的列值没有固定值,所以它的添加分区没有任何限制。
综上:
(1)对于hash分区,当执行 add partition 操作时,oracle 会自动选择分配一个分区,并重新分配部分记录到新建的
分区,也意味着可能带来一些 IO 操作。
(2)执行 alter table 时未指定 update indexes 子句:
如果是 range/list 分区,其 local 索引和 global 索引不会受影响;
如果是 hash 分区,新加分区即有数据移动的分区的 local 索引和 global 索引会被置为 unuseable ,需要重编译。
(3)复合分区完全适用上述所述规则。