Este tópico descreve como tratar valores órfãos em uma tabela particionada por lista ou intervalo.
Uma partição ou subpartição DEFAULT ou MAXVALUE captura as linhas que não correspondem às outras regras de particionamento definidas para a tabela.
Definir uma partição DEFAULT
Em tabelas particionadas por lista ou com subpartições por lista, a partição DEFAULT armazena as linhas que não se encaixam nas demais partições. Se você não incluir uma regra DEFAULT, qualquer linha contendo um valor fora das regras de particionamento gerará um erro. Cada partição em uma tabela particionada por lista, ou cada subpartição em uma tabela com subpartições por lista, pode ter sua própria regra DEFAULT.
A regra DEFAULT tem a seguinte sintaxe:
PARTITION partition_name VALUES (DEFAULT)
Nessa sintaxe, partition_name especifique o nome da partição ou subpartição usada para armazenar as linhas que não correspondem às regras de particionamento definidas para as outras partições.
No exemplo a seguir, crie-se uma tabela particionada por lista. O servidor determina em qual partição dessa tabela os dados serão armazenados com base no valor da coluna country. Se você tentar adicionar uma linha cujo valor da coluna country não esteja listado nas regras, o PolarDB retornará um erro:
acctg=# INSERT INTO sales VALUES
acctg-# (40, '3000x', 'IRELAND', '01-Mar-2012', '45000');
ERROR: inserted partition key does not map to any partition
No próximo exemplo, a mesma tabela é criada, mas com uma partição DEFAULT adicionada. As regras de particionamento definem quais valores são armazenados nas partições europe, asia ou americas. Se o valor de uma linha não estiver especificado nessas regras, o servidor armazena a linha na partição others.
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'),
PARTITION others VALUES (DEFAULT)
);
Para testar a partição DEFAULT, adicione uma linha em que o valor da coluna country não corresponda aos países especificados nas regras de particionamento:
INSERT INTO sales VALUES
(40, '3000x', 'IRELAND', '01-Mar-2012', '45000');
Consulte a tabela sales para verificar se a linha anteriormente rejeitada agora está armazenada na partição sales_others:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no | part_no | country | date | amount
----------------+---------+---------+----------+--------------------+--------
sales_others | 40 | 3000x | IRELAND | 01-MAR-12 00:00:00 | 45000
(18 rows)
Observe que o PolarDB não consegue reatribuir o conteúdo de uma partição ou subpartição DEFAULT.
Não é possível execute o comando
ALTER TABLE...ADD PARTITIONpara adicionar uma partição a uma tabela que já possui uma regra DEFAULT. No entanto, use o comandoALTER TABLE...SPLIT PARTITIONpara dividir as partições existentes.Também não é permitido execute o comando
ALTER TABLE...ADD SUBPARTITIONpara adicionar uma subpartição a uma tabela com regra DEFAULT. Contudo, o comandoALTER TABLE...SPLIT SUBPARTITIONpermite dividir as subpartições atuais.
Definir uma partição MAXVALUE
Uma partição ou subpartição MAXVALUE captura as linhas que não se encaixam nas demais partições de uma tabela particionada por intervalo ou com subpartições por intervalo. Sem uma regra MAXVALUE, ocorrerá um erro sempre que uma linha contiver um valor acima do limite superior definido pelas regras de particionamento. Cada partição ou subpartição pode ter sua própria partição MAXVALUE.
Vale ressaltar que o PolarDB não consegue reatribuir o conteúdo de uma partição ou subpartição MAXVALUE.
O comando
ALTER TABLE ... ADD PARTITIONnão pode ser usado para adicionar uma partição a uma tabela que contenha uma regra MAXVALUE. Alternativamente, utilize o comandoALTER TABLE ... SPLIT PARTITIONpara dividir as partições existentes.Da mesma forma, o comando
ALTER TABLE... ADD SUBPARTITIONnão funciona para adicionar subpartições a tabelas com regra MAXVALUE. Nesse caso, use o comandoALTER TABLE... SPLIT SUBPARTITIONpara dividir as subpartições já criadas.
A regra MAXVALUE tem a seguinte sintaxe:
PARTITION partition_name VALUES LESS THAN (MAXVALUE)
Nesse contexto, partition_name indica o nome da partição destinada a armazenar as linhas que não atendem às regras de particionamento das outras partições.
No exemplo anterior, foi criada uma tabela particionada por intervalo. Os dados dessa tabela são divididos conforme os valores da coluna date. Ao tentar inserir uma linha com data posterior àquela definida nas regras de particionamento, o PolarDB exibirá um erro:
acctg=# INSERT INTO sales VALUES
acctg-# (40, '3000x', 'IRELAND', '01-Mar-2013', '45000');
ERROR: inserted partition key does not map to any partition
O comando CREATE TABLE abaixo cria a mesma tabela, porém incluindo uma partição MAXVALUE. Em vez de gerar um erro, o servidor armazena todas as linhas que não correspondem às regras anteriores na partição others.
CREATE TABLE sales
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
amount number
)
PARTITION BY RANGE(date)
(
PARTITION q1_2012 VALUES LESS THAN('2012-Apr-01'),
PARTITION q2_2012 VALUES LESS THAN('2012-Jul-01'),
PARTITION q3_2012 VALUES LESS THAN('2012-Oct-01'),
PARTITION q4_2012 VALUES LESS THAN('2013-Jan-01'),
PARTITION others VALUES LESS THAN (MAXVALUE)
);
Para validar a partição MAXVALUE, insira uma linha cuja data seja posterior à última data listada em cada regra de particionamento. O servidor direcionará essa linha para a partição others:
INSERT INTO sales VALUES
(40, '3000x', 'IRELAND', '2015-Oct-01', '45000');
Consulte a tabela sales para confirmar se a linha antes rejeitada passou a residir na partição sales_others:
acctg=# SELECT tableoid::regclass, * FROM sales;
tableoid | dept_no | part_no | country | date | amount
---------------+---------+---------+----------+--------------------+---------
sales_q1_2012 | 10 | 4519b | FRANCE | 17-JAN-12 00:00:00 | 45000
sales_q1_2012 | 20 | 3788a | INDIA | 01-MAR-12 00:00:00 | 75000
sales_q1_2012 | 30 | 9519b | CANADA | 01-FEB-12 00:00:00 | 75000
sales_q2_2012 | 40 | 9519b | US | 12-APR-12 00:00:00 | 145000
sales_q2_2012 | 20 | 3788a | PAKISTAN | 04-JUN-12 00:00:00 | 37500
sales_q2_2012 | 30 | 4519b | CANADA | 08-APR-12 00:00:00 | 120000
sales_q2_2012 | 40 | 3788a | US | 12-MAY-12 00:00:00 | 4950
sales_q3_2012 | 10 | 9519b | ITALY | 07-JUL-12 00:00:00 | 15000
sales_q3_2012 | 10 | 9519a | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_q3_2012 | 10 | 9519b | FRANCE | 18-AUG-12 00:00:00 | 650000
sales_q3_2012 | 20 | 3788b | INDIA | 21-SEP-12 00:00:00 | 5090
sales_q3_2012 | 40 | 4788a | US | 23-SEP-12 00:00:00 | 4950
sales_q4_2012 | 40 | 4577b | US | 11-NOV-12 00:00:00 | 25000
sales_q4_2012 | 30 | 7588b | CANADA | 14-DEC-12 00:00:00 | 50000
sales_q4_2012 | 40 | 4788b | US | 09-OCT-12 00:00:00 | 15000
sales_q4_2012 | 20 | 4519a | INDIA | 18-OCT-12 00:00:00 | 650000
sales_q4_2012 | 20 | 4519b | INDIA | 02-DEC-12 00:00:00 | 5090
sales_others | 40 | 3000x | IRELAND | 01-MAR-13 00:00:00 | 45000
(18 rows)