Divide uma subpartição existente em duas novas subpartições e redistribui as linhas entre elas.
Sintaxe
Dividir uma subpartição de intervalo (usa a cláusula AT):
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]
);
Dividir uma subpartição de lista (usa a cláusula VALUES):
ALTER TABLE table_name SPLIT SUBPARTITION subpartition_name
VALUES (value[, value]...)
INTO
(
SUBPARTITION new_subpart1
[TABLESPACE tablespace_name],
SUBPARTITION new_subpart2
[TABLESPACE tablespace_name]
);
Funcionamento
Ao executar ALTER TABLE...SPLIT SUBPARTITION, o PolarDB for Oracle exclui a subpartição original e cria exatamente duas novas subpartições em seu lugar:
As linhas que atendem à restrição de subparticionamento especificada no comando são movidas para
new_subpart1.As demais linhas são movidas para
new_subpart2.
A restrição de subparticionamento deve referenciar a mesma coluna usada na definição das subpartições existentes.
Se a tabela tiver índices, eles serão recriados nas novas subpartições.
Para executar este comando, é necessário ser proprietário da tabela ou ter privilégios de superusuário (ou administrativos).
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela particionada. Opcionalmente qualificado com schema. |
|
|
Nome da subpartição a ser dividida. |
|
|
Nome da primeira nova subpartição. Recebe as linhas que satisfazem a restrição de subparticionamento. Deve ser único entre todas as partições e subpartições e seguir as convenções de nomenclatura para identificadores de objetos. |
|
|
Nome da segunda nova subpartição. Recebe todas as linhas não direcionadas a |
|
|
Um ou mais valores literais entre aspas que definem a restrição de subparticionamento. Cada regra exige pelo menos um valor. Valores especiais aceitos: |
|
|
Tablespace onde a nova subpartição residirá. Se omitido, a subpartição será criada no tablespace padrão. |
Limitações
O comando
ALTER TABLE...SPLIT SUBPARTITIONsempre divide uma subpartição em exatamente duas novas subpartições. Não há suporte para divisão em mais de duas subpartições em um único comando.A restrição de subparticionamento na cláusula
INTOdeve referenciar a mesma coluna da definição de subpartição existente.
Exemplo: dividir uma subpartição LIST
O exemplo a seguir divide a subpartição de lista p2_americas em duas novas subpartições (p2_us e p2_canada) e redistribui as linhas.
Crie a tabela sales particionada por RANGE(date) e subparticionada por LIST(country):
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')
)
);
Consulte ALL_TAB_SUBPARTITIONS para confirmar o layout inicial das subpartições:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
------------------+-------------------+-------------------
second_half_2012 | p2_europe | 'ITALY', 'FRANCE'
first_half_2012 | p1_europe | 'ITALY', 'FRANCE'
second_half_2012 | p2_americas | 'US', 'CANADA'
first_half_2012 | p1_americas | 'US', 'CANADA'
(4 rows)
Insira linhas na tabela:
INSERT INTO sales VALUES
(10, '4519b', 'FRANCE', '17-Jan-2012', '45000'),
(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'),
(10, '9519b', 'ITALY', '07-Jul-2012', '15000'),
(10, '9519a', 'FRANCE', '18-Aug-2012', '650000'),
(10, '9519b', 'FRANCE', '18-Aug-2012', '650000'),
(40, '4788a', 'US', '23-Sept-2012', '4950'),
(40, '4788b', 'US', '09-Oct-2012', '15000');
Verifique a distribuição de linhas nas subpartições:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no | part_no | country| date |amount
-------------------+---------+---------+--------+--------------------+------
sales_p1_europe | 10 | 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_p1_americas | 40 | 9519b | US | 12-APR-12 00:00:00 | 145000
sales_p1_americas | 30 | 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_p1_americas | 30 | 4519b | CANADA | 08-APR-12 00:00:00 | 120000
sales_p1_americas | 40 | 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_p2_europe | 10 | 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_p2_europe | 10 | 9519a | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_p2_europe | 10 | 9519b | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_p2_americas | 40 | 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_p2_americas | 30 | 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
sales_p2_americas | 40 | 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_p2_americas | 40 | 4788b | US | 09-OCT-12 00:00:00 | 15000
(12 rows)
Divida p2_americas em p2_us (linhas onde country = 'US') e p2_canada (todas as outras linhas):
ALTER TABLE sales SPLIT SUBPARTITION p2_americas
VALUES ('US')
INTO
(
SUBPARTITION p2_us,
SUBPARTITION p2_canada
);
A subpartição p2_americas é excluída e substituída pelas duas novas subpartições. Consulte ALL_TAB_SUBPARTITIONS para confirmar:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
------------------+-------------------+-------------------
first_half_2012 | p1_europe | 'ITALY', 'FRANCE'
first_half_2012 | p1_americas | 'US', 'CANADA'
second_half_2012 | p2_europe | 'ITALY', 'FRANCE'
second_half_2012 | p2_canada | 'CANADA'
second_half_2012 | p2_us | 'US'
(5 rows)
Consulte a tabela sales para verificar se as linhas foram redistribuídas corretamente:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no | part_no | country | date |amount
-------------------+---------+---------+---------+--------------------+------
sales_p1_europe | 10 | 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_p1_americas | 40 | 9519b | US | 12-APR-12 00:00:00 |145000
sales_p1_americas | 30 | 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_p1_americas | 30 | 4519b | CANADA | 08-APR-12 00:00:00 |120000
sales_p1_americas | 40 | 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_p2_europe | 10 | 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_p2_europe | 10 | 9519a | FRANCE | 18-AUG-12 00:00:00 |650000
sales_p2_europe | 10 | 9519b | FRANCE | 18-AUG-12 00:00:00 |650000
sales_p2_us | 40 | 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_p2_us | 40 | 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_p2_us | 40 | 4788b | US | 09-OCT-12 00:00:00 | 15000
sales_p2_canada | 30 | 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
(12 rows)
Exemplo: dividir uma subpartição RANGE
O exemplo a seguir divide a subpartição de intervalo americas_2012 em duas novas subpartições (americas_p1_2012 e americas_p2_2012) no limite '2012-Jun-01'.
Crie a tabela sales particionada por LIST(country) e subparticionada por RANGE(date):
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')
)
);
Consulte ALL_TAB_SUBPARTITIONS para confirmar o layout inicial das subpartições:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
----------------+-------------------+---------------
europe | europe_2011 | '2012-Jan-01'
europe | europe_2012 | '2013-Jan-01'
asia | asia_2011 | '2012-Jan-01'
asia | asia_2012 | '2013-Jan-01'
americas | americas_2011 | '2012-Jan-01'
americas | americas_2012 | '2013-Jan-01'
(6 rows)
Insira linhas na tabela:
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');
Verifique a distribuição de linhas nas subpartições:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no|part_no| country | date |amount
---------------------+--------+-------+---------+--------------------+---
sales_europe_2012 | 10| 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_europe_2012 | 10| 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_europe_2012 | 10| 9519a | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_europe_2012 | 10| 9519b | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_asia_2012 | 20| 3788a | INDIA | 01-MAR-12 00:00:00 | 75000
sales_asia_2012 | 20| 3788a | PAKISTAN| 04-JUN-12 00:00:00 | 37500
sales_asia_2012 | 20| 3788b | INDIA | 21-SEP-12 00:00:00 | 5090
sales_asia_2012 | 20| 4519a | INDIA | 18-OCT-12 00:00:00 | 650000
sales_asia_2012 | 20| 4519b | INDIA | 02-DEC-12 00:00:00 | 5090
sales_americas_2012 | 40| 9519b | US | 12-APR-12 00:00:00 | 145000
sales_americas_2012 | 40| 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_americas_2012 | 30| 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
sales_americas_2012 | 30| 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_americas_2012 | 30| 4519b | CANADA | 08-APR-12 00:00:00 | 120000
sales_americas_2012 | 40| 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_americas_2012 | 40| 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_americas_2012 | 40| 4788b | US | 09-OCT-12 00:00:00 | 15000
(17 rows)
Divida americas_2012 em '2012-Jun-01', enviando as linhas anteriores a essa data para americas_p1_2012 e o restante para americas_p2_2012:
ALTER TABLE sales
SPLIT SUBPARTITION americas_2012
AT('2012-Jun-01')
INTO
(
SUBPARTITION americas_p1_2012,
SUBPARTITION americas_p2_2012
);
A subpartição americas_2012 é excluída e substituída pelas duas novas subpartições. Consulte ALL_TAB_SUBPARTITIONS para confirmar:
acctg=# SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS;
partition_name | subpartition_name | high_value
----------------+-------------------+---------------
europe | europe_2012 | '2013-Jan-01'
europe | europe_2011 | '2012-Jan-01'
americas | americas_2011 | '2012-Jan-01'
americas | americas_p2_2012 | '2013-Jan-01'
americas | americas_p1_2012 | '2012-Jun-01'
asia | asia_2012 | '2013-Jan-01'
asia | asia_2011 | '2012-Jan-01'
(7 rows)
Consulte a tabela sales para verificar se as linhas foram redistribuídas corretamente:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no|part_no|country | date |amount
-----------------------+--------+-------+--------+-------------------+-------
sales_europe_2012 | 10| 4519b |FRANCE | 17-JAN-12 00:00:00| 45000
sales_europe_2012 | 10| 9519b |ITALY | 07-JUL-12 00:00:00| 15000
sales_europe_2012 | 10| 9519a |FRANCE | 18-AUG-12 00:00:00| 650000
sales_europe_2012 | 10| 9519b |FRANCE | 18-AUG-12 00:00:00| 650000
sales_asia_2012 | 20| 3788a |INDIA | 01-MAR-12 00:00:00| 75000
sales_asia_2012 | 20| 3788a |PAKISTAN| 04-JUN-12 00:00:00| 37500
sales_asia_2012 | 20| 3788b |INDIA | 21-SEP-12 00:00:00| 5090
sales_asia_2012 | 20| 4519a |INDIA | 18-OCT-12 00:00:00| 650000
sales_asia_2012 | 20| 4519b |INDIA | 02-DEC-12 00:00:00| 5090
sales_americas_p1_2012| 40| 9519b |US | 12-APR-12 00:00:00| 145000
sales_americas_p1_2012| 30| 9519b |CANADA | 01-FEB-12 00:00:00| 75000
sales_americas_p1_2012| 30| 4519b |CANADA | 08-APR-12 00:00:00| 120000
sales_americas_p1_2012| 40| 3788a |US | 12-MAY-12 00:00:00| 4950
sales_americas_p2_2012| 40| 4577b |US | 11-NOV-12 00:00:00| 25000
sales_americas_p2_2012| 30| 7588b |CANADA | 14-DEC-12 00:00:00| 50000
sales_americas_p2_2012| 40| 4788a |US | 23-SEP-12 00:00:00| 4950
sales_americas_p2_2012| 40| 4788b |US | 09-OCT-12 00:00:00| 15000
(17 rows)