合并分區(qū)
PolarDB PostgreSQL版(兼容Oracle)支持合并兩個(gè)分區(qū)或子分區(qū)。本文詳細(xì)介紹了其語(yǔ)法及示例。
語(yǔ)法說(shuō)明
合并分區(qū)
通過(guò)ALTER TABLE…MERGE PARTITION
命令將兩個(gè)分區(qū)合并為一個(gè)分區(qū),并在新分區(qū)中包含之前兩個(gè)分區(qū)的內(nèi)容。
ALTER TABLE table_name MERGE PARTITIONS
partition_name , partition_name
INTO PARTITION new_part [TABLESPACE tablespace_name] ;
ALTER TABLE ... MERGE PARTITION
命令可以在現(xiàn)有的LIST或RANGE分區(qū)表中將兩個(gè)分區(qū)合并成一個(gè)分區(qū),不能在HASH分區(qū)表中執(zhí)行。一個(gè)表具有的分區(qū)數(shù)量沒(méi)有上限。
執(zhí)行
ALTER TABLE ... MERGE PARTITION
命令時(shí),PolarDB PostgreSQL版(兼容Oracle)將創(chuàng)建一個(gè)新分區(qū),包含舊分區(qū)的內(nèi)容,包括TABLESPACE
子句以指定分區(qū)將駐留的表空間。如果未指定表空間,則分區(qū)將位于默認(rèn)表空間中。如果表已建立索引,則索引將在新分區(qū)上創(chuàng)建。您必須是表的所有者或具有超級(jí)用戶(hù)(或管理)的權(quán)限,才可以執(zhí)行
ALTER TABLE ... MERGE PARTITION
命令。
合并子分區(qū)
通過(guò)ALTER TABLE…MERGE SUBPARTITION
命令將兩個(gè)子分區(qū)合并為一個(gè)子分區(qū),并在新子分區(qū)中包含之前兩個(gè)子分區(qū)的內(nèi)容。
ALTER TABLE table_name MERGE SUBPARTITIONS
partition_name , partition_name
INTO SUBPARTITION new_part [TABLESPACE tablespace_name] ;
ALTER TABLE ... MERGE SUBPARTITION
命令可以在現(xiàn)有的LIST或RANGE分區(qū)表中將兩個(gè)子分區(qū)合并成一個(gè)子分區(qū),不能在HASH分區(qū)表中執(zhí)行。一個(gè)表具有的分區(qū)數(shù)量沒(méi)有上限。
執(zhí)行
ALTER TABLE ... MERGE SUBPARTITIO
命令時(shí),PolarDB PostgreSQL版(兼容Oracle)將創(chuàng)建一個(gè)新的子分區(qū),包含舊子分區(qū)的內(nèi)容,包括TABLESPACE
子句以指定分區(qū)將駐留的表空間。如果未指定表空間,則分區(qū)將位于默認(rèn)表空間中。如果表已建立索引,則索引將在新分區(qū)上創(chuàng)建。您必須是表的所有者或具有超級(jí)用戶(hù)(或管理)的權(quán)限,才可以執(zhí)行
ALTER TABLE ... SUBMERGE PARTITION
命令。
示例
合并分區(qū)
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
)
PARTITION BY LIST(country)
(
PARTITION europe VALUES('FRANCE', 'ITALY'),
PARTITION asia VALUES('INDIA', 'PAKISTAN'),
PARTITION americas VALUES('US', 'CANADA')
);
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');
ALTER TABLE sales SPLIT PARTITION americas
VALUES ('US')
INTO (PARTITION us, PARTITION canada);
ALTER TABLE sales MERGE PARTITIONS us, canada
INTO PARTITION americas;
合并子分區(qū)
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;
ALTER TABLE sales
SPLIT SUBPARTITION americas_2012
AT('2012-Jun-01')
INTO
(
SUBPARTITION americas_p1_2012,
SUBPARTITION americas_p2_2012
);
ALTER TABLE sales
MERGE SUBPARTITIONS americas_p1_2012 ,americas_p2_2012
INTO SUBPARTITION americas_2012;