ALTER TABLE… ADD SUBPARTITION 命令向现有二级分区的分区添加二级分区。语法如下:

ALTER TABLE table_name MODIFY PARTITION partition_name
      ADD SUBPARTITION subpartition_definition;

其中 subpartition_definition 为:

{list_subpartition | range_subpartition}

list_subpartition 为:

SUBPARTITION [subpartition_name]
  VALUES (value[, value]...)
  [TABLESPACE tablespace_name]

range_subpartition 为:

SUBPARTITION [subpartition_name]
  VALUES LESS THAN (value[, value]...)
  [TABLESPACE tablespace_name]

说明

ALTER TABLE… ADD SUBPARTITION 命令向现有分区添加二级分区;该分区必须已进行了二级分区。定义的二级分区数没有上限。

新二级分区必须与现有二级分区属于相同类型(LIST、RANGE 或 HASH)。新二级分区规则必须引用定义现有二级分区的二级分区规则中指定的相同列。

您可以使用 ALTER TABLE… ADD SUBPARTITION 语句向具有 DEFAULT 规则的表添加二级分区,只要表中的现有行与要添加的二级分区的值之间没有冲突的值即可。

您不能使用 ALTER TABLE… ADD SUBPARTITION 语句向具有 MAXVALUE 规则的表添加二级分区。

您可以使用 ALTER TABLE… SPLIT SUBPARTITION 语句拆分现有二级分区,从而有效地向表添加二级分区。

您不能在按范围进行二级分区的表中添加在现有二级分区之前的新二级分区;必须按升序指定范围二级分区。

包括 TABLESPACE 子句来指定二级分区将位于的表空间。如果您没有指定表空间,将在默认表空间中创建二级分区。

如果为表编制了索引,将在新二级分区上创建索引。

要使用 ALTER TABLE... ADD SUBPARTITION 命令,您必须是表所有者,或具有超级用户(或管理)权限。

参数

参数 说明
table_name 二级分区将位于的分区表的名称(可能是 schema 限定的)。
partition_name 新二级分区将位于的分区的名称。
subpartition_name 要创建的二级分区的名称。二级分区名称必须在所有分区和二级分区中是唯一的,并且必须遵循对象标识符的命名约定。
(value[, value]...) 使用 value 指定将表条目分组到分区中所依据的用引号括起来的文本值(或文本值的逗号分隔列表)。每个分区规则都必须至少指定一个值,但对规则中指定的值的数量没有限制。value 还可能是 NULL、DEFAULT(如果指定 LIST 分区)或 MAXVALUE(如果指定 RANGE 分区)。
tablespace_name 二级分区所在的表空间的名称。

示例 - 将二级分区添加到按列表-范围分区的表中

以下示例将 RANGE 二级分区添加到按列表分区的 sales 表中。sales 表是使用以下命令创建的:

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY LIST(country)
  SUBPARTITION BY RANGE(date)
(
  PARTITION europe VALUES('FRANCE', 'ITALY')
    (
      SUBPARTITION europe_2011
        VALUES LESS THAN('2012-Jan-01'),
      SUBPARTITION europe_2012
        VALUES LESS THAN('2013-Jan-01')
    ),
  PARTITION asia VALUES('INDIA', 'PAKISTAN')
    (
      SUBPARTITION asia_2011
        VALUES LESS THAN('2012-Jan-01'),
      SUBPARTITION asia_2012
        VALUES LESS THAN('2013-Jan-01')
    ),
  PARTITION americas VALUES('US', 'CANADA')
    (
      SUBPARTITION americas_2011
        VALUES LESS THAN('2012-Jan-01'),
      SUBPARTITION americas_2012
        VALUES LESS THAN('2013-Jan-01')
    )
);

sales 表具有三个分区,分别名为 europe、asia 和 americas。每个分区具有两个按范围定义的二级分区:

acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
 partition_name | subpartition_name |      high_value
----------------+-------------------+----------------------
 EUROPE         | EUROPE_2011       | '01-JAN-12 00:00:00'
 EUROPE         | EUROPE_2012       | '01-JAN-13 00:00:00'
 ASIA           | ASIA_2011         | '01-JAN-12 00:00:00'
 ASIA           | ASIA_2012         | '01-JAN-13 00:00:00'
 AMERICAS       | AMERICAS_2011     | '01-JAN-12 00:00:00'
 AMERICAS       | AMERICAS_2012     | '01-JAN-13 00:00:00'
(6 rows)

以下命令添加名为 europe_2013 的二级分区:

ALTER TABLE sales MODIFY PARTITION europe
  ADD SUBPARTITION europe_2013
  VALUES LESS THAN('2015-Jan-01');

在调用命令后,该表包括名为 europe_2013 的二级分区:

acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
 partition_name | subpartition_name |              high_value
----------------+-------------------+--------------------------------------------------
 EUROPE         | EUROPE_2011       | FOR VALUES FROM (MINVALUE) TO ('01-JAN-12 00:00:00')
 EUROPE         | EUROPE_2012       | FOR VALUES FROM ('01-JAN-12 00:00:00') TO ('01-JAN-13 00:00:00')
 EUROPE         | EUROPE_2013       | FOR VALUES FROM ('01-JAN-13 00:00:00') TO ('01-JAN-15 00:00:00')
 ASIA           | ASIA_2011         | FOR VALUES FROM (MINVALUE) TO ('01-JAN-12 00:00:00')
 ASIA           | ASIA_2012         | FOR VALUES FROM ('01-JAN-12 00:00:00') TO ('01-JAN-13 00:00:00')
 AMERICAS       | AMERICAS_2011     | FOR VALUES FROM (MINVALUE) TO ('01-JAN-12 00:00:00')
 AMERICAS       | AMERICAS_2012     | FOR VALUES FROM ('01-JAN-12 00:00:00') TO ('01-JAN-13 00:00:00')
(7 rows)

请注意,在添加新的范围二级分区时,二级分区规则必须指定在所有现有二级分区之后 的范围。

示例 - 将二级分区添加到按范围-列表分区的表中

以下示例将 LIST 二级分区添加到按 RANGE 分区的 sales 表中。sales 表是使用以下命令创建的:

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(date)
  SUBPARTITION BY LIST (country)
  (
    PARTITION first_half_2012 VALUES LESS THAN('01-JUL-2012')
    (
      SUBPARTITION europe VALUES ('ITALY', 'FRANCE'),
      SUBPARTITION americas VALUES ('US', 'CANADA')
    ),
    PARTITION second_half_2012 VALUES LESS THAN('01-JAN-2013')
    (
      SUBPARTITION asia VALUES ('INDIA', 'PAKISTAN')
    )
  );

执行上述命令后,sales 表将具有两个分区,分别名为 first_half_2012 和 second_half_2012。first_half_2012 分区具有两个二级分区,分别名为 europe 和 americas,而 second_half_2012 分区具有一个分区,名为 asia:

acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
  partition_name  | subpartition_name |             high_value
------------------+-------------------+-------------------------------------
 FIRST_HALF_2012  | AMERICAS          | FOR VALUES IN ('US', 'CANADA')
 FIRST_HALF_2012  | EUROPE            | FOR VALUES IN ('ITALY', 'FRANCE')
 SECOND_HALF_2012 | ASIA              | FOR VALUES IN ('INDIA', 'PAKISTAN')
(3 rows)

以下命令将二级分区添加到名为 east_asia 的 second_half_2012 分区中:

ALTER TABLE sales MODIFY PARTITION second_half_2012
  ADD SUBPARTITION east_asia VALUES ('CHINA');

在调用命令后,该表包括名为 east_asia 的二级分区:

acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
  partition_name  | subpartition_name |             high_value
------------------+-------------------+-------------------------------------
 FIRST_HALF_2012  | AMERICAS          | FOR VALUES IN ('US', 'CANADA')
 FIRST_HALF_2012  | EUROPE            | FOR VALUES IN ('ITALY', 'FRANCE')
 SECOND_HALF_2012 | EAST_ASIA         | FOR VALUES IN ('CHINA')
 SECOND_HALF_2012 | ASIA              | FOR VALUES IN ('INDIA', 'PAKISTAN')
(4 rows)