O comando ALTER TABLE...EXCHANGE PARTITION troca uma tabela existente por uma partição ou subpartição.
Visão geral
Para adicionar um grande volume de dados a uma tabela particionada, use o comando ALTER TABLE...EXCHANGE PARTITION para transferir dados em massa. Esse comando também permite remover dados obsoletos ou redundantes do armazenamento.
O comando ALTER TABLE...EXCHANGE PARTITION tem duas formas:
-
A primeira forma troca uma tabela por uma partição:
ALTER TABLE target_table EXCHANGE PARTITION target_partition WITH TABLE source_table [(WITH | WITHOUT) VALIDATION]; -
A segunda forma troca uma tabela por uma subpartição:
ALTER TABLE target_table EXCHANGE SUBPARTITION target_subpartition WITH TABLE source_table [(WITH | WITHOUT) VALIDATION];
O comando ALTER TABLE...EXCHANGE PARTITION não distingue entre partição e subpartição:
Troque uma partição usando a cláusula EXCHANGE PARTITION ou EXCHANGE SUBPARTITION.
Troque uma subpartição usando a cláusula EXCHANGE PARTITION ou EXCHANGE SUBPARTITION.
Descrição
Após a conclusão do comando ALTER TABLE...EXCHANGE PARTITION, os dados são trocados. Os dados que originalmente residiam na partição de destino passam a residir na tabela de origem, e os dados da tabela de origem passam a residir na partição de destino.
A estrutura da tabela de origem deve corresponder à estrutura da tabela de destino (ambas devem ter colunas e tipos de dados compatíveis). Além disso, os dados contidos na tabela devem obedecer às restrições de particionamento.
PolarDB for PostgreSQL (Compatible with Oracle) aceita a cláusula WITHOUT VALIDATION, mas a ignora. A nova tabela é sempre validada.
Você deve ser proprietário da tabela para executar ALTER TABLE...EXCHANGE PARTITION ou ALTER TABLE...EXCHANGE SUBPARTITION nessa tabela.
Parâmetros
|
Parâmetro |
Descrição |
|
target_table |
Nome da tabela (opcionalmente qualificado com schema) onde a partição reside. |
|
target_partition |
Nome da partição ou subpartição a ser substituída. |
|
source_table |
Nome da tabela que substituirá a |
Exemplo - trocar uma tabela por uma partição
O exemplo a seguir demonstra a troca de uma tabela pela partição americas da tabela sales. Execute o comando abaixo para criar a tabela 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')
);
Execute o comando a seguir para adicionar dados de exemplo à tabela 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');
Ao consultar a tabela sales, observa-se que apenas uma linha reside na partição americas:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no| part_no | country | date | amount
---------------+--------+---------+---------+-------------------+-----------
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
sales_americas| 40| 9519b | US | 12-APR-12 00:00:00| 145000
(10 rows)
O comando a seguir cria uma tabela (n_america) que corresponde à definição da tabela sales:
CREATE TABLE n_america
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
);
O comando abaixo adiciona dados à tabela n_america. Esses dados obedecem às regras de particionamento da partição 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');
O comando a seguir troca a tabela pela partição na tabela particionada:
ALTER TABLE sales
EXCHANGE PARTITION americas
WITH TABLE n_america;
Ao consultar a tabela sales, verifica-se que o conteúdo da tabela n_america foi trocado pelo conteúdo da partição americas:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no| part_no | country | date | amount
---------------+--------+--------+----------+--------------------+-----------
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
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
(17 rows)
A consulta à tabela n_america mostra que a linha anteriormente armazenada na partição americas foi movida para a tabela 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)