ALTER TABLE…EXCHANGE PARTITION 命令将现有表与分区进行交换。如果您计划向已分区表添加大量数据,可以使用 ALTER TABLE… EXCHANGE PARTITION 命令实现批量加载。您也可以使用 ALTER TABLE… EXCHANGE PARTITION 命令删除旧的或不需要的存储数据。

命令语法具有两种形式。

第一种形式将表交换为分区:

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 命令完成后,原来位于 target_partition 中的数据将位于 source_table 中,而原来位于 source_table 中的数据将位于 target_partition 中。

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

如果 INCLUDING INDEXES 子句是使用 EXCHANGE PARTITION 指定的,则将交换 target_partition 和 source_table 中的匹配索引。将重新生成在 source_table 中没有匹配项的 target_partition 中的索引,反之亦然(即,还将重新生成在 target_partition 中没有匹配项的 source_table 中的索引)。

如果 EXCLUDING INDEXES 子句是使用 EXCHANGE PARTITION 指定的,则将交换 target_partition 和 source_table 中的匹配索引,但在 source_table 中没有匹配项的 target_partition 索引将标记为无效,反之亦然(即,在 target_partition 中没有匹配项的 source_table 中的索引也将标记为无效)。

以前使用的匹配索引 术语是指具有相同属性的索引,例如由 CREATE INDEX 命令决定的排序规则顺序、升序或降序方向、null 最前或 null 最后的排序等属性。

如果同时省略了 INCLUDING INDEXES 和 EXCLUDING INDEXES,则默认操作为 EXCLUDING INDEXES 行为。

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

您必须拥有表才能对该表调用 ALTER TABLE… EXCHANGE PARTITION 或 ALTER TABLE… EXCHANGE SUBPARTITION。

参数

参数 说明
target_table 分区或二级分区所在的表的名称(可能是 schema 限定的)。
target_partition 要替换的分区的名称。
target_subpartition 要替换的二级分区的名称。
source_table 将替换 target_partition 或 target_subpartition 的表的名称。

示例 - 将表交换为分区

以下示例演示将表交换为 sales 表的分区 (americas)。您可以使用以下命令创建 sales 表:

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')
);

使用以下命令将示例数据添加到 sales 表中:

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');

查询 sales 表显示只有一行位于 americas 分区中:

acctg=# SELECT tableoid::regclass, * FROM sales;
    tableoid    | dept_no | part_no | country  |        date        | amount
----------------+---------+---------+----------+--------------------+--------
 sales_americas |      40 | 9519b   | US       | 12-APR-12 00:00:00 | 145000
 sales_europe   |      10 | 4519b   | FRANCE   | 17-JAN-12 00:00:00 |  45000
 sales_europe   |      10 | 9519b   | ITALY    | 07-JUL-12 00:00:00 |  15000
 sales_europe   |      10 | 9519a   | FRANCE   | 18-AUG-12 00:00:00 | 650000
 sales_europe   |      10 | 9519b   | FRANCE   | 18-AUG-12 00:00:00 | 650000
 sales_asia     |      20 | 3788a   | INDIA    | 01-MAR-12 00:00:00 |  75000
 sales_asia     |      20 | 3788a   | PAKISTAN | 04-JUN-12 00:00:00 |  37500
 sales_asia     |      20 | 3788b   | INDIA    | 21-SEP-12 00:00:00 |   5090
 sales_asia     |      20 | 4519a   | INDIA    | 18-OCT-12 00:00:00 | 650000
 sales_asia     |      20 | 4519b   | INDIA    | 02-DEC-12 00:00:00 |   5090
(10 rows)

以下命令创建一个与 sales 表的定义匹配的表 (n_america):

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

以下命令将数据添加到 n_america 表中。数据符合 americas 分区的分区规则:

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;

查询 sales 表显示 n_america 表的内容已交换为 americas 分区的内容:

acctg=# SELECT tableoid::regclass, * FROM sales;
    tableoid    | dept_no | part_no | country  |        date        | amount
----------------+---------+---------+----------+--------------------+--------
 sales_americas |      40 | 9519b   | US       | 12-APR-12 00:00:00 | 145000
 sales_americas |      40 | 4577b   | US       | 11-NOV-12 00:00:00 |  25000
 sales_americas |      30 | 7588b   | CANADA   | 14-DEC-12 00:00:00 |  50000
 sales_americas |      30 | 9519b   | CANADA   | 01-FEB-12 00:00:00 |  75000
 sales_americas |      30 | 4519b   | CANADA   | 08-APR-12 00:00:00 | 120000
 sales_americas |      40 | 3788a   | US       | 12-MAY-12 00:00:00 |   4950
 sales_americas |      40 | 4788a   | US       | 23-SEP-12 00:00:00 |   4950
 sales_americas |      40 | 4788b   | US       | 09-OCT-12 00:00:00 |  15000
 sales_europe   |      10 | 4519b   | FRANCE   | 17-JAN-12 00:00:00 |  45000
 sales_europe   |      10 | 9519b   | ITALY    | 07-JUL-12 00:00:00 |  15000
 sales_europe   |      10 | 9519a   | FRANCE   | 18-AUG-12 00:00:00 | 650000
 sales_europe   |      10 | 9519b   | FRANCE   | 18-AUG-12 00:00:00 | 650000
 sales_asia     |      20 | 3788a   | INDIA    | 01-MAR-12 00:00:00 |  75000
 sales_asia     |      20 | 3788a   | PAKISTAN | 04-JUN-12 00:00:00 |  37500
 sales_asia     |      20 | 3788b   | INDIA    | 21-SEP-12 00:00:00 |   5090
 sales_asia     |      20 | 4519a   | INDIA    | 18-OCT-12 00:00:00 | 650000
 sales_asia     |      20 | 4519b   | INDIA    | 02-DEC-12 00:00:00 |   5090
(17 rows)

查询 n_america 表显示以前存储在 americas 分区中的行已移动到 n_america 表中:

acctg=# SELECT tableoid::regclass, * FROM n_america;
 tableoid  | dept_no | part_no | country |        date        | amount
-----------+---------+---------+---------+--------------------+--------
 n_america |      40 | 9519b   | US      | 12-APR-12 00:00:00 | 145000
(1 row)