Banco de Dados

Particionamento de Tabela no PostgreSQL

Hoje com o constante crescimento nos dados é frequente termos tabelas com milhares de registro no qual aumenta seu tamanho e assim dificultando a manutenção e manipulação desses dados. Imagine uma base de dados de um cliente de comercio no qual a tabela de vendas contem os dados de 10 anos, muitas das vezes os dados de histórico são poucos sendo que na maioria das consultas geradas serão de dados dos últimos 12 meses. Para isso contamos podemos contar com o particionamento de tabela.

O particionamento de tabela é útil a fim de dividimos uma grande tabela em partições menores dessa forma torna as consultas de geração de relatório e estatísticas menos onerosas para o banco de dados. Imagine pegarmos uma base de dados com 10 anos de informação e pegamos a tabela de vendas e segmentarmos em 3 partições no qual na última partição seria guardado dados do ano corrente? Ainda podemos unir força com o recurso de Tablespaces, no qual poderíamos criar uma tablespace em uma unidade de disco mais rápida para guardar dados do ano corrente. Dessa forma com uma boa estratégia de particionamento dos dados ao invés de acessar um tabelão com milhões de registros podemos acessar uma partição com uma poção de dados bem menor e assim exigir menos do banco de dados. Então vamos começar a configuração.

“Para entender a fundo o processo e as técnicas de particionamento de tabelas no PostgreSQL, consulte a documentação oficial.

Particionamento de Tabela: Passo a passo

Criando a tabela de vendas

Para iniciarmos nosso exemplo vamos criar uma tabela chamada vendas.

Criando tabela de vendas

Importação de vendas

Para darmos continuidade vou importar um arquivo CSV e usar comando copy passando como parâmetro a tabela vendas e o local do arquivo CSV baixado.

Importando tabela de vendas do exemplo de particionamento

Deletando as vendas

Perceba que foram importados 28.047 vendas. Os dados importados possuem vendas dos anos de 2016, 2017 e 2018, podem ficar a vontade para realizar consultas na tabela importada. Agora podemos deletar esses dados importados.

Deletando as vendas importadas exemplo particionamento

Criando tabelas particionadas

A minha ideia é particionar essa tabela vendas em 3 partições, a primeira com os dados de 2016, a segunda com os dados de 2017 e a última com os dados de 2018 e anos posteriores. Essas partições poderiam ser armazenadas em tablespaces diferentes. Para realizar a configuração precisaremos criar uma tabela para cada partição e para isso vamos usar o recurso de herança de tabela do PostgreSQL. Também precisamos definir uma chave que irá controlar o intervalo da partição nesse caso foi escolhido o campo “data” com o uso da função “extract” do PostgreSQL para conseguirmos extrair o ano da data.

Criando tabelas particionadas

Após a criação das tabelas podemos ver que agora temos 4 tabelas.

Tabelas criadas via particionamento de dados

Criando as rules

Por último vamos criar 3 rules na tabela principal “Vendas” para que na inserção de novos dados os mesmos sejam realocados para suas partições respeitando a chave que controla o intervalo de partição.

Criando as rules particionamento postgresql

Testando particionamento de tabela

Agora vamos realizar o teste do particionamento, a rule do particionamento foi definido no comando INSERT por isso ao importarmos os dados do CSV com o comando COPY os mesmos não serão realocados dessa forma para realizarmos nosso teste vamos executar os seguintes passos: Cria uma tabela com mesma estrutura, importar os dados para essa nova tabela, inserir os dados importados da tabela temporária para a tabela vendas e por último excluir a tabela temporária criada.

Importação vendas no particionamento de tabela

Agora podemos ver o resultado final do teste com o seguinte comando.

Quantidade de vendas por partição

O que podemos ver é que esse recurso é transparente para para as aplicações pois as mesmas consultarão sempre a tabela principal “VENDAS” mais os dados fisicamente estarão armazenadas nas tabelas filhas, dessa forma para podermos usar o particiomaneto com eficiência, nas consultas na cláusula WHERE usar sempre a chave “data” pois se não para mostrar os dados da tabela vendas completa é preciso fazer a união das 3 tabelas filhas e ao invés de ganharmos performance estaremos perdendo. E uma outra observação é que os índices devem ser criados na tabela principal e nas tabelas filhas pois os mesmos também serão particionados e armazenados na partição junto com seus dados.

Para otimizar ainda mais suas consultas e aproveitar ao máximo a estrutura particionada, é essencial ter um bom entendimento de SQL. Convido você a aprofundar seus conhecimentos com meu artigo sobre os fundamentos de SQL para análise de dados, que fornece uma base sólida para qualquer profissional que trabalha com grandes conjuntos de dados.

Editar post
0 0 votes
Article Rating
Subscribe
Notify of
Amaury Euzébio
0 Comentários
Inline Feedbacks
View all comments
Botão Voltar ao Topo