Use ALTER TABLE ... ADD PARTITION para adicionar uma ou mais partições novas e vazias a uma tabela particionada existente. Este é o método padrão para acomodar o crescimento de dados em tabelas particionadas por LIST e RANGE.
Funcionamento
O comando ALTER TABLE ... ADD PARTITION é uma operação de metadados, mas sua duração e impacto na concorrência dependem quase inteiramente da configuração de índices da tabela.
Ao executar o comando, o banco de dados adquire um bloqueio exclusivo na tabela de destino, impedindo todas as operações simultâneas de SELECT, INSERT, UPDATE e DELETE. O bloqueio permanece ativo até a conclusão do comando.
Comportamento dos índices após ADD PARTITION
|
Tipo de índice |
Comportamento |
|
Índice local |
O banco de dados cria automaticamente uma nova partição de índice na nova partição da tabela. Se a tabela tiver múltiplos índices locais, o sistema criará uma partição de índice para cada um. Esse é o principal fator determinante da duração da operação. |
|
Índice global |
A estrutura permanece inalterada. Nenhuma manutenção adicional é necessária, pois os índices globais cobrem automaticamente os dados inseridos na nova partição. |
Duração da operação
Tabelas sem índices: execução quase instantânea; apenas os metadados da tabela são atualizados.
Tabelas com índices: duração proporcional ao tempo necessário para criar índices locais na nova partição vazia.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma tabela particionada existente (LIST ou RANGE)
Privilégios de proprietário da tabela ou uma conta privilegiada
Limitações
Regras básicas de definição
Consistência do tipo de partição: A nova partição deve corresponder ao tipo de partição existente na tabela (
LISTouRANGE).Consistência da chave de partição: A regra de particionamento deve referenciar as mesmas colunas de chave de partição definidas para a tabela.
Nome único da partição: O nome deve ser exclusivo em todas as partições e subpartições da tabela.
Restrições de valores de partição
-
Partições MAXVALUE e DEFAULT: Não é possível adicionar uma partição a uma tabela particionada por RANGE que já tenha uma partição
MAXVALUE, nem a uma tabela particionada por LIST que já tenha uma partiçãoDEFAULT. Essas partições abrangentes cobrem logicamente todos os valores não especificados, sem deixar espaço para uma nova. UseALTER TABLE ... SPLIT PARTITIONpara dividir primeiro a partiçãoMAXVALUEouDEFAULTe, em seguida, adicione a nova partição.A divisão de uma partição
MAXVALUEouDEFAULTpode mover dados, causando sobrecarga significativa de I/O e bloqueios. Execute esta operação fora do horário de pico.-- Example: split the MAXVALUE partition to make room for 2024 data ALTER TABLE sales SPLIT PARTITION max_partition AT (TO_DATE('2025-01-01', 'YYYY-MM-DD')) INTO (PARTITION p_2024, PARTITION max_partition); Ordem das partições RANGE: O valor
VALUES LESS THANda nova partição deve ser maior que o limite superior da partição mais alta atual. Não é possível inserir uma partição entre ou antes das partições existentes.Unicidade de valores na partição LIST: Os valores na nova partição não podem se sobrepor aos valores de qualquer partição existente. Valores sobrepostos geram o erro
ERROR: partition "xx" would overlap partition "xxx".
Requisitos de privilégio
Você deve ser o proprietário da tabela ou usar uma conta privilegiada.
Sintaxe
ALTER TABLE table_name ADD PARTITION partition_spec;
partition_spec — para uma partição LIST:
PARTITION partition_name VALUES (value_list)
[TABLESPACE tablespace_name]
[(subpartition_spec, ...)]
partition_spec — para uma partição RANGE:
PARTITION partition_name VALUES LESS THAN (value_list)
[TABLESPACE tablespace_name]
[(subpartition_spec, ...)]
subpartition_spec — para uma subpartição LIST:
SUBPARTITION subpartition_name VALUES (value_list)
[TABLESPACE tablespace_name]
subpartition_spec — para uma subpartição RANGE:
SUBPARTITION subpartition_name VALUES LESS THAN (value_list)
[TABLESPACE tablespace_name]
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela particionada de destino. |
|
|
Nome da nova partição. Deve ser exclusivo em todas as partições e subpartições. |
|
|
Para partições LIST: um ou mais valores literais a serem atribuídos a esta partição. |
|
|
Para partições RANGE: o limite superior da partição (exclusivo). |
|
|
Tablespace para a nova partição ou subpartição. Assume o tablespace padrão da tabela se não for especificado. |
|
|
Nome da nova subpartição. Deve ser exclusivo em todas as partições e subpartições. |
Adicionar uma partição a uma tabela particionada por LIST
Este exemplo adiciona uma nova região geográfica a uma tabela particionada por país.
-
Crie a tabela de exemplo
sales_list, particionada porcountry.CREATE TABLE sales_list ( dept_no NUMBER, part_no VARCHAR2(50), country VARCHAR2(20), sale_date DATE, amount NUMBER ) PARTITION BY LIST(country) ( PARTITION europe VALUES ('FRANCE', 'ITALY'), PARTITION asia VALUES ('INDIA', 'PAKISTAN'), PARTITION americas VALUES ('US', 'CANADA') ); -
Adicione uma nova partição
east_asiapara'CHINA'e'KOREA'.ALTER TABLE sales_list ADD PARTITION east_asia VALUES ('CHINA', 'KOREA'); -
(Opcional) Verifique se a nova partição foi criada.
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS WHERE table_name = 'sales_list';O resultado inclui a partição
east_asia.
Adicionar uma partição a uma tabela particionada por RANGE
Este exemplo estende uma tabela particionada por data com uma nova partição trimestral.
-
Crie a tabela de exemplo
sales_range, particionada porsale_date.A função
TO_DATEgarante a clareza do formato de data. Na prática, o formato da string deve corresponder à configuraçãoNLS_DATE_FORMATdo banco de dados.CREATE TABLE sales_range ( dept_no NUMBER, part_no VARCHAR2(50), country VARCHAR2(20), sale_date DATE, amount NUMBER ) PARTITION BY RANGE(sale_date) ( PARTITION q1_2023 VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')), PARTITION q2_2023 VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD')), PARTITION q3_2023 VALUES LESS THAN (TO_DATE('2023-10-01', 'YYYY-MM-DD')), PARTITION q4_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) ); -
Adicione a partição
q1_2024. Seu limite superior deve ser maior que2024-01-01, o limite mais alto atual.ALTER TABLE sales_range ADD PARTITION q1_2024 VALUES LESS THAN (TO_DATE('2024-04-01', 'YYYY-MM-DD')); -
(Opcional) Confirme se a nova partição aparece no final da lista de partições.
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS WHERE table_name = 'sales_range';
Adicionar uma partição a uma tabela com particionamento composto
Para uma tabela com particionamento composto RANGE-LIST, defina subpartições simultaneamente à adição de uma partição de nível superior.
-
Crie a tabela de exemplo
composite_sales.CREATE TABLE composite_sales ( sale_id NUMBER, sale_date DATE, region VARCHAR2(20) ) PARTITION BY RANGE(sale_date) SUBPARTITION BY LIST(region) ( PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')) ( SUBPARTITION p_2023_north VALUES ('NORTH'), SUBPARTITION p_2023_south VALUES ('SOUTH') ) ); -
Adicione a partição
p_2024com duas subpartições.ALTER TABLE composite_sales ADD PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')) ( SUBPARTITION p_2024_north VALUES ('NORTH'), SUBPARTITION p_2024_south VALUES ('SOUTH') ); -
(Opcional) Verifique se as subpartições foram criadas.
SELECT partition_name, subpartition_name, high_value FROM ALL_TAB_SUBPARTITIONS WHERE table_name = 'composite_sales' AND partition_name = 'p_2024';
Melhores práticas
Agende durante uma janela de manutenção
O comando ADD PARTITION mantém um bloqueio exclusivo na tabela durante toda a operação, impedindo qualquer DML. Em tabelas grandes com vários índices locais, o bloqueio pode durar vários minutos. Agende esta operação fora do horário de pico para evitar impactos nos serviços online.
Monitore as esperas de bloqueio
Durante a operação, monitore o banco de dados quanto a esperas de bloqueio. Se o tempo de espera for excessivo, cancele a operação e reagende-a.
Estime a duração antes de executar
Para tabelas com índices locais, estime a duração da operação medindo o tempo necessário para criar os mesmos índices em uma tabela vazia com o mesmo esquema.
Limite a contagem total de partições
Embora não haja um limite rígido para o número de partições por tabela, mantenha o total abaixo de 1.000. Um número excessivo de partições aumenta o custo de análise do otimizador de consultas e pode degradar o desempenho das consultas.