Particionamento de Tabelas no postgres – automatizando

ParticionentoJá falamos um bocado sobre particionamento de tabelas por aqui:

Para encerrar a série, vamos juntar tudo numa única função para tornar o dia-a-dia mais simples. Claro, se você tem poucas tabelas particionadas e se criar novas partições é algo raro, então você não deve se preocupar com isso. Assim sendo, sei que estou escrevendo para um público bem pequeno, mas que vem crescendo conforme o postgres sai do cantinho dos fundos dos grandes CPDs para ocupar cada vez mais uma posição de destaque. Bom, uma função genérica para qualquer tipo de particionamento daria muito trabalho para implementar, portanto a função que vou apresentar apresenta algumas características particulares que você pode adaptar para necessidades específicas se quiser:

  • Eu utilizo uma tabela para cadastrar o nome das tabelas que serão particionadas e algumas informações específicas sobre o particionamento de cada uma destas tabelas. Assim a nossa função vai sempre varrer esta tabela e criar todas as partições cadastradas de uma vez só;
  • A chave será sempre num campo do tipo INTEGER e cada partição utilizará um valor único na chave e não uma série de valores. Então vamos ter coisas como CHAVE = VALOR;
  • A função está preparada para trabalhar com versões a partir do 8.3 do postgres. Se você utiliza versões anteriores a 8.3… realmente está na hora de você migrar. E veja se vai logo para o 9.2, pois as vantagens são realmente recompensadoras. Faremos algumas checagens dentro da função para saber com qual versão estamos lidando e fazer os ajustes necessários;
  • Não iremos apenas criar as partições. Vamos aproveitar para já fazer algumas manutenções de acordo com as informações cadastradas na nossa tabela de partições.

Ao executar a função vamos executar as seguintes tarefas nesta ordem:

  • Verifica se alguma FK de tabela não particionada aponta para uma tabela particionada;
  • Carrega dados no cadastro de particionamento;
  • Verifica se a tabela mãe cadastrada existe?
  • Verifica se o tablespace existe;
  • Verifica se a partição a ser criada já existe;
  • Cria a partição da tabela;
  • Ajusta parâmetros de STORAGE na partição criada;
  • Remove restrição NO INHERIT da tabela filha;
  • Importa os dados da tabela mãe para a partição;
  • Cria CHECK CONSTRAINT para a chave da partição;
  • Ajusta o dono da partição criada;
  • Ajusta GRANTs para a partição criada;
  • Cria ou substitui função do gatilho;
  • Ajusta o dono da função;
  • Verifica se o gatilho ja existe;
  • Cria constraints para tabelas não particionadas;
  • Arquiva partição antiga;
  • Apaga partição arquivada antiga;
  • Apaga partição antiga;

Agora vejamos a nossa tabela para cadastrar os parâmetros de todas tabelas que serão particionadas numa tacada só.

Para testar, vamos utilizar as tabelas DETALHE e DETALHE_PEDIDO criadas nos posts anteriores:

E la vai a pedrada… segue o código a função

E por fim o teste no psql:

 

Você pode adaptar este script para trabalhar com intervalos ou outros tipos de dados alem de inteiros. Se tiver alguma sugestão para melhorar… é só comentar aqui.

Bom, acho que chega de particionamento por enquanto.

2 comentários sobre “Particionamento de Tabelas no postgres – automatizando

Dúvidas, sugestões, críticas, comentários e cervejas são bem vindos!!!