Descubra como funcionam os processos de Vacuum e Autovacuum no PostgreSQL, técnicas essenciais para garantir a consistência dos dados e a performance do seu banco de dados. Saiba como otimizar o espaço em disco e melhorar suas consultas.
Tempo de Leitura: 4 minutos
Se você utiliza banco de dados PostgreSQL com certeza já ouviu falar no MCVV Multi Version Concurrency Control, mas senão aqui vai uma breve explicação. Resumidamente é uma técnica específica desse sistema gerenciador de banco de dados para garantir a consistência dos dados, onde todas as transações acessam os dados conforme eles estavam naquele exato momento de conexão, independentemente de estarem sendo alteradas por outras transações. Mas como sabemos em tecnologia toda funcionalidade tem seu trade-off.
Com o MCVV a dificuldade que o acompanha é o acúmulo de “linhas mortas” devido a gravação e permanência do histórico da linha por um período determinado, causando uso maior de espaço em disco, flodando index e tabelas, reduzindo a performance das consultas e aumentando o tempo de processamento.
A partir disso surgiu a necessidade de limpeza dessas linhas mortas, então as rotinas de vacuum foram desenvolvidas com esse objetivo, de realizar uma limpeza física do disco, onde identificam as linhas marcadas como mortas pelo MCVV e a exclusão é realizada.
Para uma melhor abordagem há dois processos que devem ser utilizados em conjunto em sua rotina de administração:
O que é o Vacuum no PostgreSQL
É um comando manual que deve ser incluído em sua rotina de administração de banco de dados, pode rodar apontando para uma tabela ou banco de dados inteiro.
Tipos de Vacuum no PostgreSQL
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
Esse processo ocorre em paralelo com as demais consultas, ou seja, não exige bloqueio exclusivo nos objetos, que estiver atuando apenas transações DDL serão bloqueadas (alter table e etc). É esperado que haja um aumento IOPS devido a esse processo, pois leituras nas tabelas inteiras ocorrem para que as linhas mortas sejam identificadas e excluídas.
É um processo lento, então tenha ciência de realizá-lo apenas em um momento de baixo consumo do seu banco de dados.
Um ponto muito importante a se destacar é o processo de vacuum só recupera espaço em disco em cenário fáceis, como quando consegue bloqueio exclusivo rapidamente da tabela ou quando uma ou mais páginas no final de uma tabela fiquem totalmente livres.
Com parâmetros do comando vacuum temos:
Vacuum FULL
Copia a tabela inteira para um novo espaço, compactando todos os espaços livres disponibilizados pelo vacuum, reduzindo ativamente espaço em disco. Para usar essa opção é necessário espaço em disco suficiente para a reescrita dos dados. Deve ser usado com muita cautela, por ser um processo bem lento, que exige bloqueio exclusivo do banco de dados.
Vacuum FREEZE
Seleciona “congelamento” agressivo das linhas, basicamente congela o ID da transação para todas as páginas, independentemente de terem sido modificadas ou não, para que todas as linhas atuais sejam vistas como antigas para todas as novas transações. Essa opção sempre será ativa quando usar FULL.
São opções semelhantes não iguais.
Vacuum VERBOSE
Disponibiliza um acompanhamento de todas as ações que estão ocorrendo durante todo o processo.
Vacuum ANALYZE
Opção responsável por atualizar as estatísticas usadas pelo planejador do plano de consultas. Pode ser acionado individualmente, mas em conjunto com o vacuum temos uma excelente abordagem de otimização, por exigir apenas bloqueio de leitura da tabela, permitindo que as demais transações ocorram normalmente no banco de dados.
Autovacuum do PostgreSQL
É uma ferramenta opcional, mas é expressamente recomendado que esse processo nunca seja desativado em seu banco de dados, por executar de forma automática pelo sistema gerenciador do PostgreSQL, as ações de vacuum e analyze em background. O controle desse processo é realizado através dos valores definidos nos parâmetros de configuração.
Configurando o Autovacuum
Para identificar os valores dos parâmetros definidos na sua instância de banco de dados use esse SQL:
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name IN (
'autovacuum_max_workers',
'autovacuum_analyze_scale_factor',
'autovacuum_naptime',
'autovacuum_analyze_threshold',
'autovacuum_analyze_scale_factor',
'autovacuum_vacuum_threshold',
'autovacuum_vacuum_scale_factor',
'autovacuum_vacuum_threshold',
'autovacuum_vacuum_cost_delay',
'autovacuum_vacuum_cost_limit',
'vacuum_cost_limit',
'autovacuum_freeze_max_age',
'maintenance_work_mem',
'vacuum_freeze_min_age');
Dentre os parâmetros citados acima os que mais influenciam são os seguintes:
maintenance_work_mem
autovacuum_freeze_max_age
autovacuum_max_workers
autovacuum_vacuum_cost_delay
autovacuum_vacuum_cost_limit
O autovacuum é indicado para monitorar picos não esperados nas tabelas, devido às suas regras de verificação em quais tabelas deve executar as ações de limpeza, garantindo que todas tabelas (em todos os bancos de dados) que excedam esses valores seja marcada para o vacuum. O processo de autovacuum conta com outros processos que ocorrem em conjunto para que essa ferramenta possa ser utilizada, mas não entraremos em detalhes, nesse artigo você pode encontrar mais informações aqui.
Dicas e Melhores Práticas
A documentação oficial do PostgreSQL faz algumas sugestões que podem auxiliar o desenvolvimento inicial das rotinas:
Frequência de Rotinas de Vacuum
Quanto maior a frequência das rotinas de vacumm menor será a necessidade de executar vacuum full e bloquear todo o seu banco para essa ação
Usando Vacuum FULL com Cautela
Se há previsão de crescimento em uma tabela mesmo havendo crescimento também das linhas mortas a utilização de vacuum full não é recomendada como uma boa abordagem, pois espaço será liberado ao sistema para posterior utilização pela mesma tabela. Isso é visto como trabalho redundante.
Combinando Vacuum e ANALYZE
Apenas o vacuum não atualiza as estatísticas usadas pelo planejador de consultas, responsável pela aumento de performance, logo é recomendado que o analyze seja utilizado em conjunto nas rotinas.
Entendendo a Importância dos Processos
Nesse artigo citamos dois processos nativos do PostgreSQL muito semelhantes em alguns pontos, podendo causar confusão inicial dos motivos de serem utilizados sempre de forma conjunta e não substitutiva. Portanto, atenha-se a resposta ela é bem simples, são processos com o mesmo objetivo, redução de espaço desnecessário em disco e melhoria de performance em todas as consultas executadas, porém cada um com suas particularidades e atuações.
As rotinas de vacuum manual são implementadas conforme o consumo do seu banco de dados em questão, influenciado diretamente em como a sua aplicação manipula os dados. Para definição dessas rotinas, o seu conhecimento sobre o seu ambiente de produção deve sempre ser considerado, pois o recomendado é que as tabelas com maiores taxas de update e delete sejam mapeadas para limpeza frequente, já nas rotinas de autovacuum todas as tabelas serão monitoradas conforme a regra mencionada.
Ações automatizadas/automáticas em administração de banco de dados nunca irão substituir o conhecimento, olhar analítico e avaliação de seu administrador, tenha sempre isso em mente. A função de um DBA é mais do que apenas executar comandos.
Junte-se à nossa comunidade, o Fórum da Casa do Desenvolvedor, para compartilhar suas experiências, fazer perguntas e colaborar com outros entusiastas do PostgreSQL. Te encontro por lá, basta clicar no botão abaixo: