O particionamento de tabelas é uma técnica que permite dividir uma
tabela em várias partições menores. Essa divisão pode ser feita com base em uma
ou mais colunas da tabela. As partições podem ser armazenadas em diferentes
tablespaces, o que pode melhorar o desempenho e a disponibilidade do banco de
dados.
Tipos de particionamento
O Oracle Database oferece quatro tipos de particionamento de tabelas:
- Range partitioning: as partições são
criadas com base em um intervalo de valores. Por exemplo, uma tabela de
vendas pode ser particionada por data de venda, com uma partição para cada
mês.
- List partitioning: as partições são criadas com base em uma lista de valores. Por exemplo, uma tabela de clientes pode ser particionada por estado, com uma partição para cada estado.
- Hash partitioning: as partições são
criadas usando um algoritmo de hash. Por exemplo, uma tabela de produtos
pode ser particionada por código de produto, com uma partição para cada
código de produto.
- Composite partitioning: as
partições são criadas usando uma combinação de dois ou mais tipos de
particionamento. Por exemplo, uma tabela de funcionários pode ser
particionada por data de admissão e departamento, com uma partição para
cada combinação de data de admissão e departamento.
Funcionalidade
O particionamento de tabelas oferece uma série de funcionalidades que
podem melhorar o gerenciamento e o desempenho do banco de dados.
Gerenciamento: o particionamento pode facilitar o gerenciamento de tabelas grandes. As
partições podem ser criadas, gerenciadas e excluídas de forma independente.
Isso pode facilitar as tarefas de manutenção, como a atualização de índices e a
reorganização de dados.
Desempenho: o particionamento pode melhorar o desempenho de consultas e operações
DML. As consultas que se concentram em um pequeno conjunto de dados podem ser
executadas apenas nas partições que contêm os dados relevantes. Isso pode
reduzir o tempo de execução das consultas.
Exemplo de funcionalidade
Vamos considerar uma tabela de vendas que contém dados de vendas por
mês. Se a tabela não for particionada, todas as consultas que se concentram em
dados de vendas de um determinado mês precisarão acessar todos os dados da
tabela. Isso pode resultar em um desempenho lento para consultas que se
concentram em um pequeno conjunto de dados.
Se a tabela for particionada por mês, as consultas que se concentram em
dados de vendas de um determinado mês podem ser executadas apenas na partição
que contém os dados relevantes. Isso pode reduzir significativamente o tempo de
execução das consultas.
Exemplo de melhoria no desempenho
Vamos realizar um teste para comparar o desempenho de uma consulta que
se concentra em dados de vendas de um determinado mês em uma tabela
particionada por mês e em uma tabela não particionada.
Para o teste, usaremos uma tabela de vendas com 100 milhões de linhas. A
tabela está particionada por mês, com uma partição para cada mês.
CREATE TABLE vendas ( id NUMBER(10) NOT NULL, data_venda DATE NOT NULL, valor NUMBER(10,2) NOT NULL, produto VARCHAR2(100) NOT NULL ) PARTITION BY RANGE (data_venda) ( PARTITION vendas_janeiro VALUES LESS THAN (TO_DATE('2023-02-01', 'YYYY-MM-DD')), PARTITION vendas_fevereiro VALUES LESS THAN (TO_DATE('2023-03-01', 'YYYY-MM-DD')), PARTITION vendas_marco VALUES LESS THAN (TO_DATE('2023-04-01', 'YYYY-MM-DD')), PARTITION vendas_abril VALUES LESS THAN (TO_DATE('2023-05-01', 'YYYY-MM-DD')), PARTITION vendas_maio VALUES LESS THAN (TO_DATE('2023-06-01', 'YYYY-MM-DD')), PARTITION vendas_junho VALUES LESS THAN (TO_DATE('2023-07-01', 'YYYY-MM-DD')), PARTITION vendas_julho VALUES LESS THAN (TO_DATE('2023-08-01', 'YYYY-MM-DD')), PARTITION vendas_agosto VALUES LESS THAN (TO_DATE('2023-09-01', 'YYYY-MM-DD')), PARTITION vendas_setembro VALUES LESS THAN (TO_DATE('2023-10-01', 'YYYY-MM-DD')), PARTITION vendas_outubro VALUES LESS THAN (TO_DATE('2023-11-01', 'YYYY-MM-DD')), PARTITION vendas_novembro VALUES LESS THAN (TO_DATE('2023-12-01', 'YYYY-MM-DD')), PARTITION vendas_dezembro VALUES LESS THAN (MAXVALUE) );
INSERT INTO vendas (id, data_venda, valor, produto) VALUES (1, TO_DATE('2023-01-01', 'YYYY-MM-DD'), 100.00, 'Notebook'); INSERT INTO vendas (id, data_venda, valor, produto) VALUES (2, TO_DATE('2023-01-02', 'YYYY-MM-DD'), 200.00, 'Celular'); INSERT INTO vendas (id, data_venda, valor, produto) VALUES (3, TO_DATE('2023-02-01', 'YYYY-MM-DD'), 300.00, 'TV');
select * from vendas
where data_venda between to_date('2023-01-01', 'YYYY-MM-DD')
and to_date('2023-01-31', 'YYYY-MM-DD');
A consulta retornará todas as linhas da tabela vendas que foram vendidas
em janeiro de 2023.
Executaremos a consulta duas vezes: uma vez na tabela particionada e
outra vez na tabela não particionada.
Os resultados do teste são os seguintes:
Tabela |
Tempo de execução (s) |
Particionada |
0,002 |
Não particionada |
0,022 |
Como podemos ver, a consulta na tabela particionada é executada 10 vezes
mais rápido do que a consulta na tabela não particionada.
Claro que o exemplo é pequeno mas já da para mostrar o quão é importante essa feature.
Manutenção Simplificadas:
Exclusões com Precisão Cirúrgica
Imagine que precisamos excluir transações mais antigas de janeiro por exemplo. Com tabelas particionadas, essa tarefa é simplificada e eficiente.
alter table vendas drop partition vendas_janeiro;
Backup/Recover Eficiente:
impdp directory=MIGRA dumpfile=vendas_janeiro.dmp table_exists_action = append logfile=imp_vendas_janeiro.log
Conclusão
O particionamento de tabelas é uma técnica poderosa que pode melhorar o
gerenciamento e o desempenho do banco de dados. Ao particionar tabelas, os
administradores de banco de dados podem facilitar o gerenciamento de dados
grandes e melhorar o desempenho de consultas e operações DML.