Todos os produtos
Search
Central de documentação

PolarDB:ALTER TABLE SPLIT PARTITION

Última atualização: Jul 02, 2026

Divide uma partição de intervalo (RANGE) ou lista (LIST) em duas novas partições. Essa operação reorganiza os dados e é irreversível. Antes de executar este comando, planeje os limites e nomes das novas partições e faça backup dos seus dados.

Sinopse

-- Split a RANGE partition
ALTER TABLE table_name SPLIT PARTITION partition_name
  AT (range_part_value)
  INTO 
  (
    PARTITION new_part1 
      [TABLESPACE tablespace_name],
    PARTITION new_part2 
      [TABLESPACE tablespace_name]
  ); 

-- Split a LIST partition
ALTER TABLE table_name SPLIT PARTITION partition_name
  VALUES (value[, value]...) 
  INTO 
  (
    PARTITION new_part1 
      [TABLESPACE tablespace_name],
    PARTITION new_part2 
      [TABLESPACE tablespace_name]
  );

Parâmetros

Parâmetro

Obrigatório

Descrição

Exemplo

table_name

Sim

Nome da tabela particionada de destino.

log_archives

partition_name

Sim

Nome da partição existente a ser dividida.

p_2022

AT (range_part_value)

Para dividir uma partição RANGE

Define o ponto de divisão para uma partição RANGE. Este valor torna-se o limite inferior da segunda nova partição.

AT (TO_DATE('2022-07-01', 'YYYY-MM-DD'))

VALUES (value[, value]...)

Para dividir uma partição LIST

Especifique a lista de valores a serem atribuídos à primeira nova partição ao dividir uma partição LIST.

VALUES ('China', 'Singapore')

INTO (...)

Sim

Indica os nomes das duas novas partições e um tablespace opcional. A partição new_part1 contém os dados anteriores ao ponto de divisão, enquanto new_part2 armazena os dados posteriores a esse ponto.

INTO (PARTITION p_h1, PARTITION p_h2)

TABLESPACE tablespace_name

NãoValor padrão: tablespace padrão da tabela

Determina o tablespace de armazenamento para as novas partições. É possível definir tablespaces diferentes ou o mesmo tablespace para ambas as novas partições.

TABLESPACE tbs_archive

Observações

  • Você deve ser o proprietário da tabela ou ter a permissão ALTER sobre ela.

  • O comando SPLIT PARTITION adquire um AccessExclusiveLock, que é um bloqueio exclusivo no nível da tabela. Esse bloqueio impede 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 uma janela de tempo suficiente.

  • O ponto de divisão deve ser válido:

    • Em partições RANGE, o valor na cláusula AT precisa estar entre os limites superior e inferior da partição a ser dividida.

    • Em partições LIST, a lista de valores na cláusula VALUES deve ser um subconjunto da lista de valores da partição original.

Exemplos

Dividir uma partição de intervalo (RANGE)

Este exemplo demonstra como dividir uma partição de log anual chamada p_2022 em duas partições semestrais denominadas p_2022_h1 e p_2022_h2.

Preparar o ambiente

Esta etapa cria uma tabela chamada log_archives particionada por intervalo de tempo e insere dados que abrangem o ponto de divisão.

-- Create a partitioned table.
CREATE TABLE log_archives (
    log_id   INT NOT NULL,
    log_time DATE NOT NULL
)
PARTITION BY RANGE (log_time) (
    PARTITION p_2022 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD'))
);

INSERT INTO log_archives VALUES (1, TO_DATE('2022-01-10', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (2, TO_DATE('2022-02-15', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (3, TO_DATE('2022-03-20', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (4, TO_DATE('2022-05-05', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (5, TO_DATE('2022-06-25', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (6, TO_DATE('2022-07-15', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (7, TO_DATE('2022-08-01', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (8, TO_DATE('2022-10-30', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (9, TO_DATE('2022-11-11', 'YYYY-MM-DD'));
INSERT INTO log_archives VALUES (10, TO_DATE('2022-12-24', 'YYYY-MM-DD'));

Realizar a verificação prévia

Antes de dividir a partição, garanta que seus dados tenham backup e verifique se a partição original existe.

-- Important: Before you split the partition, make sure that you have backed up the relevant data.
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'LOG_ARCHIVES';

Executar o comando

Utilize 2022-07-01 como ponto de divisão e execute o comando SPLIT PARTITION.

ALTER TABLE log_archives SPLIT PARTITION p_2022 
AT (TO_DATE('2022-07-01', 'YYYY-MM-DD'))
INTO (PARTITION p_2022_h1, PARTITION p_2022_h2);

Verificar o resultado

Confirme que a partição original foi substituída por duas novas partições e que os dados estão distribuídos corretamente.

-- Verify the structure: Confirm that the new partitions are created and the old partition is removed.
SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'LOG_ARCHIVES';
-- The query result should contain p_2022_h1 and p_2022_h2, but not p_2022.

-- Verify the data: Confirm that the data is distributed based on the split point.
SELECT COUNT(*) FROM log_archives PARTITION (p_2022_h1); -- The result should be 5.
SELECT COUNT(*) FROM log_archives PARTITION (p_2022_h2); -- The result should be 5.

Dividir uma partição de lista (LIST)

Neste cenário, dividimos uma partição de vendas asiáticas chamada p_asia, que contém vários países e regiões, em uma partição separada para a China chamada p_china e outra partição chamada p_asia_others para os demais países e regiões asiáticos.

Preparar o ambiente

Aqui criamos uma tabela chamada sales_by_region particionada por uma lista de regiões de vendas.

-- Create a partitioned table.
CREATE TABLE sales_by_region (
    sale_id INT,
    country VARCHAR2(20)
)
PARTITION BY LIST (country) (
    PARTITION p_asia VALUES ('China', 'Japan', 'Korea', 'Singapore')
);
INSERT INTO sales_by_region VALUES (101, 'China');
INSERT INTO sales_by_region VALUES (102, 'China');
INSERT INTO sales_by_region VALUES (201, 'Japan');
INSERT INTO sales_by_region VALUES (301, 'Korea');
INSERT INTO sales_by_region VALUES (401, 'Singapore');

Realizar a verificação prévia

Verifique se a partição p_asia existe e analise sua distribuição de dados.

SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_BY_REGION';
SELECT country, COUNT(*) FROM sales_by_region GROUP BY country;

Executar o comando

Use a cláusula VALUES para separar os dados de 'China' da partição p_asia em uma nova partição chamada p_china.

ALTER TABLE sales_by_region SPLIT PARTITION p_asia
VALUES ('China')
INTO (PARTITION p_china, PARTITION p_asia_others);

Verificar o resultado

Valide se a partição original foi substituída por duas novas partições, se suas listas de valores foram atribuídas corretamente e se os dados migraram conforme esperado.

-- Verify the structure: Confirm that the new partitions and their value lists are created.
SELECT PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'SALES_BY_REGION';
-- The query result should contain:
-- P_CHINA, 'China'
-- P_ASIA_OTHERS, 'Japan', 'Korea', 'Singapore'

-- Verify the data: Confirm that the data is distributed to the new partitions.
SELECT COUNT(*) FROM sales_by_region PARTITION (p_china);       -- The result should be 2.
SELECT COUNT(*) FROM sales_by_region PARTITION (p_asia_others); -- The result should be 3.

Perguntas frequentes

P1: Por que recebo o erro ORA-14080: partition cannot be split?Geralmente, esse erro ocorre porque o ponto de divisão definido é inválido. Para uma partição RANGE, o valor na cláusula AT deve estar entre os limites superior e inferior da partição sendo dividida. Já em uma partição LIST, a lista de valores na cláusula VALUES precisa ser um subconjunto próprio e não vazio da lista de valores da partição original.

P2: Por que recebo o erro ORA-14078: partition name is already in use?Esse erro indica que o nome da nova partição especificado na cláusula INTO já está sendo usado por outra partição na tabela. Altere o nome para um identificador exclusivo dentro da tabela.

P3: Por que o SPLIT PARTITION está lento?Essa operação envolve reorganização e cópia física de dados. O tempo de execução é proporcional ao volume de dados na partição e gera uma quantidade significativa de I/O. Trata-se de uma operação que consome muitos recursos. Execute-a fora do horário de pico.

Instruções SQL relacionadas