Use a cláusula PARTITION BY da instrução CREATE TABLE para criar uma tabela particionada. Os dados são distribuídos entre uma ou mais partições e, opcionalmente, subpartições.
Sintaxe
Particionamento por lista
CREATE TABLE [ schema. ]table_name
table_definition
PARTITION BY LIST(column)
[SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)]
(list_partition_definition[, list_partition_definition]...);
Em que list_partition_definition é:
PARTITION [partition_name]
VALUES (value[, value]...)
[TABLESPACE tablespace_name]
[(subpartition, ...)]
Particionamento por intervalo
CREATE TABLE [ schema. ]table_name
table_definition
PARTITION BY RANGE(column[, column ]...)
[SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)]
(range_partition_definition[, range_partition_definition]...);
Em que range_partition_definition é:
PARTITION [partition_name]
VALUES LESS THAN (value[, value]...)
[TABLESPACE tablespace_name]
[(subpartition, ...)]
Subparticionamento
Uma subpartition pode ser:
{list_subpartition | range_subpartition}
Em que list_subpartition é:
SUBPARTITION [subpartition_name]
VALUES (value[, value]...)
[TABLESPACE tablespace_name]
E range_subpartition é:
SUBPARTITION [subpartition_name]
VALUES LESS THAN (value[, value]...)
[TABLESPACE tablespace_name]
Descrição
A instrução CREATE TABLE... PARTITION BY cria uma tabela com uma ou mais partições, cada uma podendo conter uma ou mais subpartições. Não há limite para o número de partições. Ao usar a cláusula PARTITION BY, inclua pelo menos uma regra de particionamento. A tabela resultante pertence ao usuário que a criou.
PARTITION BY LIST
Use PARTITION BY LIST para direcionar linhas às partições com base no valor de uma coluna especificada. Cada regra de particionamento deve definir pelo menos um valor literal; não há limite superior para a quantidade de valores por regra.
Inclua uma regra DEFAULT como última regra de particionamento para capturar quaisquer linhas que não correspondam aos valores de outra partição. Sem uma partição DEFAULT, qualquer comando INSERT que não corresponda a uma regra existente falhará com um erro.
PARTITION BY RANGE
Use PARTITION BY RANGE para rotear linhas em partições com base em intervalos de valores de colunas. Cada regra exige pelo menos uma coluna com tipo de dado compatível com operadores de comparação.
Os limites do intervalo são avaliados usando LESS THAN e são exclusivos: um limite de 2013-Jan-01 captura apenas linhas com valores até 31 de dezembro de 2012.
Defina as regras de particionamento em ordem crescente. Se a chave de partição de uma linha exceder o maior limite definido, o INSERT falhará, a menos que exista uma regra MAXVALUE. Inclua MAXVALUE como última regra para evitar esse erro.
SUBPARTITION BY
Quando SUBPARTITION BY faz parte da definição da tabela, cada partição contém pelo menos uma subpartição. As subpartições podem ser definidas explicitamente ou geradas pelo sistema.
Subpartições geradas pelo sistema são criadas no tablespace padrão, e o servidor atribui seus nomes combinando o nome da partição com um identificador único:
Ao especificar
SUBPARTITION BY LIST, o servidor cria uma subpartiçãoDEFAULT.Ao especificar
SUBPARTITION BY RANGE, o servidor cria uma subpartiçãoMAXVALUE.
Para visualizar todos os nomes das subpartições, visualize ALL_TAB_SUBPARTITIONS.
TABLESPACE
Use a palavra-chave TABLESPACE para especificar o tablespace de uma partição ou subpartição. Se omitida, a partição ou subpartição será criada no tablespace padrão.
Índices em tabelas particionadas
Ao criar um índice em uma tabela particionada usando a sintaxe CREATE TABLE, o índice é criado em cada partição e subpartição.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela a ser criada, opcionalmente qualificado com o schema. |
|
|
Nomes de colunas, tipos de dados e informações de restrições, conforme descrito na documentação principal do PostgreSQL para |
|
|
Nome da partição. Deve ser único em todas as partições e subpartições, seguindo as convenções de nomenclatura para identificadores de objetos. |
|
|
Nome da subpartição. Deve ser único em todas as partições e subpartições, seguindo as convenções de nomenclatura para identificadores de objetos. |
|
|
Coluna na qual as regras de particionamento se baseiam. Cada linha é armazenada na partição correspondente ao valor dessa coluna. |
|
|
Um ou mais valores literais entre aspas que definem a associação à partição. O valor pode ser |
|
|
Tablespace onde a partição ou subpartição reside. |
Exemplos
PARTITION BY LIST
O exemplo abaixo cria uma tabela sales particionada por lista com três partições baseadas na coluna country.
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')
);
Consulte ALL_TAB_PARTITIONS para verificar a estrutura das partições:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
partition_name | high_value
----------------+---------------------
americas | 'US', 'CANADA'
asia | 'INDIA', 'PAKISTAN'
europe | 'FRANCE', 'ITALY'
(3 rows)
Roteamento de linhas:
Linhas com
country = 'US'ou'CANADA'vão para a partiçãoamericas.Linhas com
country = 'INDIA'ou'PAKISTAN'vão para a partiçãoasia.Linhas com
country = 'FRANCE'ou'ITALY'vão para a partiçãoeurope.
O seguinte comando INSERT corresponde à regra de particionamento europe e é armazenado na partição europe:
INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');
PARTITION BY RANGE
Este exemplo cria uma tabela sales particionada por intervalo com quatro partições trimestrais baseadas na coluna date.
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')
);
Consulte ALL_TAB_PARTITIONS para verificar a estrutura das partições:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
partition_name | high_value
----------------+------------------------------------------------------------------
q1_2012 | FOR VALUES FROM (MINVALUE) TO ('01-APR-12 00:00:00')
q2_2012 | FOR VALUES FROM ('01-APR-12 00:00:00') TO ('01-JUL-12 00:00:00')
q3_2012 | FOR VALUES FROM ('01-JUL-12 00:00:00') TO ('01-OCT-12 00:00:00')
q4_2012 | FOR VALUES FROM ('01-OCT-12 00:00:00') TO ('01-JAN-13 00:00:00')
(4 rows)
Roteamento de linhas:
Linhas com
dateanterior a 1º de abril de 2012 vão paraq1_2012.Linhas com
dateanterior a 1º de julho de 2012 vão paraq2_2012.Linhas com
dateanterior a 1º de outubro de 2012 vão paraq3_2012.Linhas com
dateanterior a 1º de janeiro de 2013 vão paraq4_2012.
O seguinte comando INSERT corresponde ao limite de q3_2012 e é armazenado na partição q3_2012:
INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');
PARTITION BY RANGE, SUBPARTITION BY LIST
O exemplo a seguir cria uma tabela sales particionada primeiro pela data da transação (intervalo) e depois subparticionada por país (lista). O resultado são quatro partições de intervalo, cada uma com três subpartições de lista — totalizando 12 subpartições.
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 q1_2012 VALUES LESS THAN('2012-Apr-01')
(
SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q1_americas VALUES ('US', 'CANADA')
),
PARTITION q2_2012 VALUES LESS THAN('2012-Jul-01')
(
SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q2_americas VALUES ('US', 'CANADA')
),
PARTITION q3_2012 VALUES LESS THAN('2012-Oct-01')
(
SUBPARTITION q3_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q3_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q3_americas VALUES ('US', 'CANADA')
),
PARTITION q4_2012 VALUES LESS THAN('2013-Jan-01')
(
SUBPARTITION q4_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q4_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q4_americas VALUES ('US', 'CANADA')
)
);
Consulte ALL_TAB_SUBPARTITIONS para verificar a estrutura das subpartições:
SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
subpartition_name | high_value | partition_name
-------------------+-------------------------------------+----------------
q1_americas | FOR VALUES IN ('US', 'CANADA') | q1_2012
q1_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q1_2012
q1_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q1_2012
q2_americas | FOR VALUES IN ('US', 'CANADA') | q2_2012
q2_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q2_2012
q2_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q2_2012
q3_americas | FOR VALUES IN ('US', 'CANADA') | q3_2012
q3_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q3_2012
q3_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q3_2012
q4_americas | FOR VALUES IN ('US', 'CANADA') | q4_2012
q4_asia | FOR VALUES IN ('INDIA', 'PAKISTAN') | q4_2012
q4_europe | FOR VALUES IN ('FRANCE', 'ITALY') | q4_2012
(12 rows)
Roteamento de linhas: ao inserir uma linha, o servidor avalia primeiro o valor de date nas regras de particionamento por intervalo para selecionar uma partição e, em seguida, avalia o valor de country nas regras de subparticionamento por lista para escolher uma subpartição. Como toda linha é armazenada em uma subpartição, as partições de nível superior não contêm dados diretamente.
O seguinte comando INSERT é armazenado na subpartição q3_europe (date cai no terceiro trimestre de 2012, country é 'FRANCE'):
INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');