O particionamento por intervalo de faixa estende o particionamento por faixa e cria novas partições automaticamente à medida que os dados chegam. Se os dados inseridos ultrapassarem o valor máximo da última partição de faixa definida, o banco de dados criará uma nova partição sem intervenção manual.
Para usar o particionamento por intervalo de faixa, inclua a cláusula INTERVAL na instrução CREATE TABLE e especifique o tamanho da partição. O valor da chave de partição determina o limite superior de cada partição de faixa, que atua como ponto de transição: dados acima desse limite acionam a criação automática de partições.
Como funciona o salto: Se os dados caírem dois ou mais intervalos além do ponto de transição atual, o banco de dados cria apenas a partição que contém esses dados e ignora as intermediárias.
Exemplo: Suponha um intervalo mensal com ponto de transição em 15 de fevereiro de 2019. Ao inserir uma linha datada de 10 de maio de 2019, o sistema cria a partição referente ao período de 15 de abril a 15 de maio de 2019. As partições de 15 de fevereiro a 15 de março e de 15 de março a 15 de abril são ignoradas; somente a partição que realmente contém os dados é criada.
Sintaxe
CREATE TABLE [schema.]<table_name>
<table_definition>
PARTITION BY RANGE (<column> [, <column>]...)
[INTERVAL (<constant> | <expression>)]
[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>, ...)]
O parâmetro INTERVAL aceita expressões numéricas e de tempo:
|
Tipo |
Expressão |
Efeito |
|
Numérico |
|
Uma partição a cada 10 valores consecutivos |
|
Ano |
|
Uma partição por ano |
|
Mês |
|
Uma partição por mês |
|
Dia |
|
Uma partição por dia |
|
Semana |
|
Uma partição por semana |
Para ver a sintaxe completa de CREATE TABLE ... PARTITION BY, consulte CREATE TABLE... PARTITION BY.
Exemplo
O exemplo abaixo cria uma tabela sales particionada por sold_month com intervalo mensal. Duas partições de faixa iniciais estabelecem o ponto de transição; linhas além desse ponto acionam a criação automática de partições.
Crie a tabela:
CREATE TABLE sales
(
prod_id int,
prod_quantity int,
sold_month date
)
PARTITION BY RANGE(sold_month)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p1
VALUES LESS THAN('15-JAN-2019'),
PARTITION p2
VALUES LESS THAN('15-FEB-2019')
);
CREATE TABLE sales
(
prod_id int,
prod_quantity int,
sold_month date
)
PARTITION BY RANGE(sold_month) SUBPARTITION BY HASH(prod_id)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
SUBPARTITION TEMPLATE 4
(
PARTITION p1
VALUES LESS THAN('15-JAN-2019'),
PARTITION p2
VALUES LESS THAN('15-FEB-2019')
);
Selecione as partições iniciais:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
partition_name | high_value
----------------+--------------------------------------------------------------
P1 | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
P2 | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(2 rows)
Insira uma linha além do ponto de transição:
INSERT INTO sales VALUES (1, 200, '10-MAY-2019');
INSERT 0 1
Selecione as partições novamente:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
partition_name | high_value
----------------+--------------------------------------------------------------
SYS596430103 | FOR VALUES FROM ('15-APR-19 00:00:00') TO ('15-MAY-19 00:00:00')
P1 | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
P2 | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(3 rows)
O banco de dados criou automaticamente uma nova partição para armazenar a linha de 10 de maio de 2019. Como nenhum dado caiu nas faixas de 15 de fevereiro a 15 de março e de 15 de março a 15 de abril, essas partições foram ignoradas.
O sistema atribui um nome com prefixo SYS (como SYS596430103) a cada partição criada automaticamente. Esse nome é único, mas varia conforme a sessão.
Restrições do particionamento por intervalo de faixa
A chave de partição deve ser uma única coluna que especifique uma faixa numérica ou de data.
Defina pelo menos uma partição de faixa antes que a cláusula
INTERVALentre em vigor.Tabelas organizadas por índice não suportam a cláusula
INTERVAL.Não crie índices de domínio em tabelas particionadas por lista.
A coluna da chave de partição não pode conter valores NULL, NaN (Not-a-Number) ou Infinito.
As expressões na cláusula
INTERVALdevem resultar em valores constantes não negativos.A criação de partições de intervalo de faixa ocorre exclusivamente em ordem crescente.