MigraTI - Soluções em banco de dados

terça-feira, 21 de novembro de 2023

Melhorando o gerenciamento e o desempenho com tabelas particionadas

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:

Imagine fazer backup apenas de um pedaço de sua tabela:

expdp directory=MIGRA dumpfile=vendas_janeiro.dmp tables=vendas:vendas_janeiro logfile=exp_vendas_janeiro.log

Ou recuperar o pedaço da tabela:

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.