分割分区
PolarDB PostgreSQL版(兼容Oracle)支持分割一个分区或者子分区,本文详细介绍了其语法及示例。
语法说明
分割分区
通过ALTER TABLE…SPLIT PARTITION
命令将单个分区分为两个分区,并在新分区之间重新分配分区的内容。
ALTER TABLE <table_name> SPLIT PARTITION <partition_name>
AT (<range_part_value>)
INTO
(
PARTITION <new_part1>
[TABLESPACE <tablespace_name>]
PARTITION <new_part2>
[TABLESPACE <tablespace_name>]
);
ALTER TABLE <table_name> SPLIT PARTITION <partition_name>
VALUES (<value>[, <value>]...)
INTO
(
PARTITION <new_part1>
[TABLESPACE <tablespace_name>]
PARTITION <new_part2>
[TABLESPACE <tablespace_name>]
);
分割子分区
通过ALTER TABLE…SPLIT SUBPARTITION
命令将单个子分区分为两个子分区,并重新分布子分区的内容。
ALTER TABLE <table_name> SPLIT SUBPARTITION <subpartition_name>
AT (range_part_value)
INTO
(
SUBPARTITION <new_subpart1>
[TABLESPACE <tablespace_name>],
SUBPARTITION <new_subpart2>
[TABLESPACE <tablespace_name>]
);
ALTER TABLE <table_name> SPLIT SUBPARTITION <subpartition_name>
VALUES (<value>[, <value>]...)
INTO
(
SUBPARTITION <new_subpart1>
[TABLESPACE <tablespace_name>],
SUBPARTITION <new_subpart2>
[TABLESPACE <tablespace_name>]
);
ALTER TABLE...SPLIT SUBPARTITION
命令将子分区添加到现有的子分区表中。定义的子分区数量没有上限。当执行ALTER TABLE...SPLIT SUBPARTITION
命令时,PolarDB PostgreSQL版(兼容Oracle)会创建两个新子分区,将包含受指定子分区规则约束的值的任何行移至new_subpart1
,并将所有剩余行移至new_subpart2
。
示例
分割分区
通过ALTER TABLE...SPLIT PARTITION
命令将分区添加到现有的LIST或RANGE分区表中。
说明
ALTER TABLE…SPLIT PARTITION
命令无法将分区添加到HASH分区表。
--分割列表分区
ALTER TABLE sales SPLIT PARTITION americas
VALUES ('US')
INTO (PARTITION us, PARTITION canada);
--分割范围分区
ALTER TABLE sales SPLIT PARTITION q4_2012
AT ('15-Nov-2012')
INTO
(
PARTITION q4_2012_p1,
PARTITION q4_2012_p2
);
分割列表子分区
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 p1_europe VALUES ('ITALY', 'FRANCE'),
SUBPARTITION p1_americas VALUES ('US', 'CANADA')
),
PARTITION second_half_2012 VALUES LESS THAN('01-JAN-2013')
(
SUBPARTITION p2_europe VALUES ('ITALY', 'FRANCE'),
SUBPARTITION p2_americas VALUES ('US', 'CANADA')
)
);
ALTER TABLE sales SPLIT SUBPARTITION p2_americas
VALUES ('US')
INTO
(
SUBPARTITION p2_us,
SUBPARTITION p2_canada
);
分割范围子分区
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')
)
);
ALTER TABLE sales
SPLIT SUBPARTITION americas_2012
AT('2012-Jun-01')
INTO
(
SUBPARTITION americas_p1_2012,
SUBPARTITION americas_p2_2012
);