Todos os produtos
Search
Central de documentação

PolarDB:ALTER TABLE ADD SUBPARTITION

Última atualização: Jun 28, 2026

Adiciona uma nova subpartição a uma partição de primeiro nível especificada em uma tabela com particionamento composto. Antes de executar esta instrução, confirme se a partição pai possui uma política de subparticionamento definida e se os limites ou valores da nova subpartição não entram em conflito com as subpartições existentes.

Sinopse

ALTER TABLE table_name
MODIFY PARTITION partition_name
ADD SUBPARTITION { list_subpartition | range_subpartition };

-- LIST subpartition definition
SUBPARTITION subpartition_name
  VALUES (value[, value]...)
  [TABLESPACE tablespace_name]

-- RANGE subpartition definition
SUBPARTITION subpartition_name
  VALUES LESS THAN (value[, value]...)
  [TABLESPACE tablespace_name]

Parâmetros

Parâmetro

Obrigatório

Descrição

Exemplo

table_name

Sim

Nome da tabela de destino com particionamento composto.

sales_data

partition_name

Sim

Nome da partição de primeiro nível à qual adicionar a nova subpartição.

p_2023

subpartition_name

Sim

Nome da nova subpartição. Deve ser exclusivo em todas as partições e subpartições da tabela.

sp_q1_asia

VALUES

Sim

Valores de limite para a nova subpartição. Para uma subpartição LIST, especifique um ou mais valores literais. Para uma subpartição RANGE, use VALUES LESS THAN para definir o limite superior.

VALUES ('Asia') ou VALUES LESS THAN (TO_DATE(...))

TABLESPACE tablespace_name

Não. Padrão: tablespace padrão da tabela.

Tablespace para a nova subpartição.

TABLESPACE users_tbs

Observações de uso

  • O tipo de subpartição (LIST ou RANGE) deve corresponder ao tipo das subpartições existentes na mesma partição pai.

  • O nome definido em subpartition_name deve ser exclusivo entre todas as partições e subpartições da tabela.

  • Ao adicionar uma subpartição RANGE, o valor de limite definido por VALUES LESS THAN (...) deve ser maior que o limite superior de todas as subpartições existentes. Subpartições RANGE só podem ser anexadas em ordem crescente. Para inserir uma subpartição intermediária, use ALTER TABLE ... SPLIT SUBPARTITION para dividir uma subpartição existente.

  • Ao adicionar uma subpartição LIST, os valores em sua lista VALUES (...) não podem se sobrepor aos valores de nenhuma subpartição existente na mesma partição pai.

  • Não use ADD SUBPARTITION em uma partição regida por uma regra MAXVALUE ou DEFAULT. Em vez disso, use ALTER TABLE ... SPLIT SUBPARTITION para dividir a partição de limite existente.

  • ADD SUBPARTITION adquire um bloqueio exclusivo no nível da tabela (AccessExclusiveLock), que bloqueia todas as operações de linguagem de manipulação de dados (DML) e a maioria das operações de linguagem de definição de dados (DDL) na tabela. Execute este comando fora do horário de pico e reserve tempo suficiente para sua conclusão.

  • Não há limite declarado para o número de subpartições, mas mantenha o total de partições por tabela abaixo de 1.000 para garantir desempenho e gerenciabilidade ideais.

  • Se a tabela possuir um índice, o banco de dados criará automaticamente uma partição de índice correspondente para a nova subpartição.

  • Você deve ser proprietário da tabela ou ter privilégios de administrador para executar este comando.

  • A nova subpartição inicialmente não possui estatísticas. Para ajudar o otimizador de consultas a gerar planos de execução precisos, colete estatísticas imediatamente após adicionar a subpartição.

Exemplos

Adicionar uma subpartição LIST a uma tabela com particionamento composto RANGE-LIST

Este exemplo adiciona uma subpartição para a região Africa à partição de 2023 de uma tabela com particionamento composto por ano de venda (RANGE) e região de venda (LIST).

Preparar o ambiente

Crie uma tabela com particionamento composto RANGE-LIST chamada sales_data, particionada por RANGE em sale_date e subparticionada por LIST em region.

-- Create a RANGE-LIST composite partitioned table
CREATE TABLE sales_data (
    sale_id    INT,
    region     VARCHAR2(20),
    sale_date  DATE
)
PARTITION BY RANGE (sale_date)
SUBPARTITION BY LIST (region)
(
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION sp_2023_asia   VALUES ('Asia'),
        SUBPARTITION sp_2023_europe VALUES ('Europe')
    )
);

Realizar verificação prévia

Antes de adicionar a subpartição, verifique se a partição de primeiro nível de destino existe e confira suas subpartições atuais.

-- Check that the first-level partition p_2023 exists
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_DATA';

-- Check the existing subpartitions under p_2023 to confirm that 'Africa' does not already exist
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'SALES_DATA' AND PARTITION_NAME = 'P_2023';

Adicionar a subpartição

Adicione uma nova subpartição com o valor 'Africa' à partição p_2023.

ALTER TABLE sales_data MODIFY PARTITION p_2023 ADD SUBPARTITION sp_2023_africa VALUES('Africa');

Verificar o resultado

Confirme se a nova subpartição existe e se aceita dados correspondentes à sua definição de valor.

-- Structure verification: confirm the new subpartition has been added
SELECT SUBPARTITION_NAME FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'SALES_DATA' AND PARTITION_NAME = 'P_2023';
-- The result should include sp_2023_africa

-- Data verification: insert a row and confirm it is routed to the new subpartition
INSERT INTO sales_data VALUES (101, 'Africa', TO_DATE('2023-09-15', 'YYYY-MM-DD'));

SELECT COUNT(*) FROM sales_data SUBPARTITION (sp_2023_africa);
-- The result should be 1

Adicionar uma subpartição RANGE a uma tabela com particionamento composto RANGE-RANGE

Este exemplo adiciona uma subpartição referente ao segundo trimestre (Q2) à partição de 2023 de uma tabela com particionamento composto por ano do pedido (RANGE) e data do pedido (RANGE).

Preparar o ambiente

Crie uma tabela com particionamento composto RANGE-RANGE chamada order_history, particionada por RANGE em order_date e subparticionada por RANGE em order_date.

-- Assumes a tablespace named archive_tbs already exists
-- CREATE TABLESPACE archive_tbs DATAFILE 'archive_tbs.dbf' SIZE 10M;

-- Create a RANGE-RANGE composite partitioned table
CREATE TABLE order_history (
    order_id   INT,
    order_date DATE
)
PARTITION BY RANGE (order_date)
SUBPARTITION BY RANGE (order_date)
(
    PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    (
        SUBPARTITION sp_2023_q1 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD'))
    )
);

Realizar verificação prévia

Verifique se a partição de primeiro nível de destino existe e examine os limites de suas subpartições atuais para confirmar que o novo limite não gera conflitos.

-- Check that the first-level partition p_2023 exists
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'ORDER_HISTORY';

-- Check existing subpartitions and their boundaries under p_2023
SELECT SUBPARTITION_NAME, HIGH_VALUE FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'ORDER_HISTORY' AND PARTITION_NAME = 'P_2023';

Adicionar a subpartição

Adicione uma nova subpartição com limite superior de 2023-07-01 à partição p_2023.

ALTER TABLE order_history MODIFY PARTITION p_2023
ADD SUBPARTITION sp_2023_q2 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD'));

Verificar o resultado

Confirme se a nova subpartição foi criada e se aceita dados.

-- Structure verification: confirm the new subpartition exists
SELECT * FROM USER_TAB_SUBPARTITIONS
WHERE TABLE_NAME = 'ORDER_HISTORY' AND SUBPARTITION_NAME = 'SP_2023_Q2';
-- The result should show SP_2023_Q2

-- Data verification: insert a row and confirm it is routed to the new subpartition
INSERT INTO order_history VALUES (201, TO_DATE('2023-05-20', 'YYYY-MM-DD'));

SELECT COUNT(*) FROM order_history SUBPARTITION (sp_2023_q2);
-- The result should be 1

Perguntas frequentes

Por que recebo o erro ORA-14321: subpartition ... already exists?

A definição VALUES da nova subpartição entra em conflito com uma já existente sob a mesma partição pai. No caso de uma subpartição LIST, o valor já pertence a outra subpartição. Para subpartições RANGE, o novo limite não é estritamente superior ao último definido. Especifique um valor de limite sem sobreposição e tente novamente.

Por que recebo o erro ORA-02269: partition does not exist?

A partition_name indicada na cláusula MODIFY PARTITION não existe na tabela. Consulte USER_TAB_PARTITIONS para obter o nome correto da partição de primeiro nível.

Por que recebo o erro ORA-14150: subpartitioning is not specified?

A tabela de destino não possui uma política de subparticionamento. O comando ADD SUBPARTITION aplica-se apenas a tabelas com particionamento composto.

Por que recebo o erro ORA-01031: insufficient privileges?

O usuário atual não tem o privilégio ALTER na tabela de destino. Entre em contato com um administrador de banco de dados para conceder o privilégio necessário.

Por que recebo o erro ORA-14074: partition bound must collate higher than that of the last partition?

O comando ADD SUBPARTITION só permite anexar uma subpartição RANGE ao final do intervalo existente, em ordem crescente. Para inserir uma subpartição intermediária, use ALTER TABLE ... SPLIT SUBPARTITION.

Instruções relacionadas