文档

交换分区

更新时间:

PolarDB PostgreSQL版(兼容Oracle)支持交换两个分区或者子分区的内容。本文详细介绍了其语法及示例。

语法说明

交换分区

ALTER TABLE <target_table>
  EXCHANGE PARTITION <target_partition>
  WITH TABLE <source_table>
  [(INCLUDING | EXCLUDING) INDEXES]
  [(WITH | WITHOUT) VALIDATION];

交换子分区

ALTER TABLE <target_table>
  EXCHANGE SUBPARTITION <target_subpartition>
  WITH TABLE <source_table>
  [(INCLUDING | EXCLUDING) INDEXES]
  [(WITH | WITHOUT) VALIDATION];
  • ALTER TABLE…EXCHANGE PARTITION命令将现有表与分区交换。 如果您计划向分区表添加大量数据,可以使用ALTER TABLE…EXCHANGE PARTITION命令来实现批量加载。 您还可以使用ALTER TABLE…EXCHANGE PARTITION命令删除旧的或不需要的数据进行存储。

  • ALTER TABLE…EXCHANGE PARTITION命令执行完成时,原来位于target_partition中的数据将交换至source_table中,原来位于source_table中的数据将交换至target_partition中。

  • ALTER TABLE…EXCHANGE PARTITION命令可以交换LIST、RANGE或HASH分区表中的分区。 source_table的结构必须与target_table的结构匹配(两个表必须具有匹配的列和数据类型),并且表中包含的数据必须遵守分区约束。

  • 如果使用EXCHANGE PARTITION指定INCLUDING INDEXES子句,则将交换target_partitionsource_table中的匹配索引。 target_partition中与source_table中不匹配的索引将被重建,反之亦然(即source_table中与target_partition中不匹配的索引也会被重建)。

  • 如果使用EXCHANGE PARTITION指定EXCLUDING INDEXES子句,则将交换target_partitionsource_table中匹配的索引,但source_table中与target_partition中不匹配的索引将被标记为无效,反之亦然(即target_partition中与source_table中不匹配的索引也被标记为无效)。

  • 使用的匹配索引项是指具有相同属性的索引。例如,由CREATE INDEX命令确定的排序顺序、升序/降序方向、空值在前/空值在后的排序等。

  • 如果INCLUDING INDEXESEXCLUDING INDEXES都被省略,则默认操作是EXCLUDING INDEXES行为。

  • 与上面描述相同的行为适用于与EXCHANGE SUBPARTITION子句一起使用的target_subpartition

  • 您必须拥有一个表才能对该表调用ALTER TABLE...EXCHANGE PARTITIONALTER TABLE...EXCHANGE SUBPARTITION命令。

示例

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
  (40, '9519b', 'US', '12-Apr-2012', '145000'),
  (10, '4519b', 'FRANCE', '17-Jan-2012', '45000'),
  (20, '3788a', 'INDIA', '01-Mar-2012', '75000'),
  (20, '3788a', 'PAKISTAN', '04-Jun-2012', '37500'),
  (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'),
  (20, '4519a', 'INDIA', '18-Oct-2012', '650000'),
  (20, '4519b', 'INDIA', '2-Dec-2012', '5090');

CREATE TABLE n_america
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
);

INSERT INTO n_america VALUES
  (40, '9519b', 'US', '12-Apr-2012', '145000'),
  (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'),
  (40, '4788a', 'US', '23-Sept-2012', '4950'),
  (40, '4788b', 'US', '09-Oct-2012', '15000');

ALTER TABLE sales
  EXCHANGE PARTITION americas
  WITH TABLE n_america;