使用ALTER TABLE...MERGE SUBPARTITION
命令可以将两个子分区合并为一个新的子分区,新的子分区包含原有两个子分区的所有内容。
说明
- 您必须是表的所有者或拥有表的管理权限才能执行该语句。
- 该SQL命令仅支持在LIST分区表和RANGE分区表中使用,不支持在HASH分区表中使用。
- 如果表中已经创建索引,将在新分区中也创建该索引。
语法
ALTER TABLE table_name MERGE SUBPARTITIONS
partition_name , partition_name
INTO SUBPARTITION new_part [TABLESPACE tablespace_name] ;
参数
参数 | 说明 |
---|---|
table_name |
分区表的名称,可指定Schema。 |
partition_name |
需要合并的两个子分区名称,以英文逗号(,)分隔。 |
new_part |
合并后新子分区的名称。
分区名称在所有分区和子分区中必须唯一。 |
tablespace_name |
指定新子分区将驻留的表空间。
如果未指定表空间,则新子分区将创建在默认表空间中。 |
示例
创建一个名为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')
)
);
SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS where table_name = 'SALES';
INSERT INTO sales VALUES
(10, '4519b', 'FRANCE', '17-Jan-2012', '45000'),
(20, '3788a', 'INDIA', '01-Mar-2012', '75000'),
(40, '9519b', 'US', '12-Apr-2012', '145000'),
(20, '3788a', 'PAKISTAN', '04-Jun-2012', '37500'),
(40, '4577b', 'US', '11-Nov-2012', '25000'),
(30, '7588b', 'CANADA', '14-Dec-2012', '50000'),
(30, '9519b', 'CANADA', '01-Feb-2012', '75000'),
(30, '4519b', 'CANADA', '08-Apr-2012', '120000'),
(40, '3788a', 'US', '12-May-2012', '4950'),
(10, '9519b', 'ITALY', '07-Jul-2012', '15000'),
(10, '9519a', 'FRANCE', '18-Aug-2012', '650000'),
(10, '9519b', 'FRANCE', '18-Aug-2012', '650000'),
(20, '3788b', 'INDIA', '21-Sept-2012', '5090'),
(40, '4788a', 'US', '23-Sept-2012', '4950'),
(40, '4788b', 'US', '09-Oct-2012', '15000'),
(20, '4519a', 'INDIA', '18-Oct-2012', '650000'),
(20, '4519b', 'INDIA', '2-Dec-2012', '5090');
SELECT tableoid::regclass, * FROM sales;
将americas_2012
子分区拆分成americas_p1_2012
和americas_p2_2012
两个子分区,示例如下:
ALTER TABLE sales
SPLIT SUBPARTITION americas_2012
AT('2012-Jun-01')
INTO
(
SUBPARTITION americas_p1_2012,
SUBPARTITION americas_p2_2012
);
将americas_p1_2012
子分区和americas_p2_2012
子分区合并到一个新子分区new_americas_2012
,示例如下:
ALTER TABLE sales
MERGE SUBPARTITIONS americas_p1_2012 ,americas_p2_2012
INTO SUBPARTITION new_americas_2012;