Todos os produtos
Search
Central de documentação

PolarDB:CREATE TABLE... PARTITION BY

Última atualização: Jun 28, 2026

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ção DEFAULT.

  • Ao especificar SUBPARTITION BY RANGE, o servidor cria uma subpartição MAXVALUE.

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

table_name

Nome da tabela a ser criada, opcionalmente qualificado com o schema.

table_definition

Nomes de colunas, tipos de dados e informações de restrições, conforme descrito na documentação principal do PostgreSQL para CREATE TABLE.

partition_name

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.

subpartition_name

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.

column

Coluna na qual as regras de particionamento se baseiam. Cada linha é armazenada na partição correspondente ao valor dessa coluna.

(value[, value]...)

Um ou mais valores literais entre aspas que definem a associação à partição. O valor pode ser NULL, DEFAULT (para partições LIST) ou MAXVALUE (para partições RANGE).

tablespace_name

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ção americas.

  • Linhas com country = 'INDIA' ou 'PAKISTAN' vão para a partição asia.

  • Linhas com country = 'FRANCE' ou 'ITALY' vão para a partição europe.

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 date anterior a 1º de abril de 2012 vão para q1_2012.

  • Linhas com date anterior a 1º de julho de 2012 vão para q2_2012.

  • Linhas com date anterior a 1º de outubro de 2012 vão para q3_2012.

  • Linhas com date anterior a 1º de janeiro de 2013 vão para q4_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');