Uma característica importante do PostgreSQL é o isolamento de suas transações. Esse mecanismo utiliza o método MVCC (Multiversion Concurrency Control), ou Controle de Concorrência Multiversão. Este método apresenta vantagens e possibilidades a partir de seus mecanismos implementados, como, por exemplo, a redução de bloqueios ao permitir que várias transações simultâneas acessem os mesmos registros. Isso resulta em um cenário em que leituras não bloqueiam escritas e vice-versa. Por outro lado, uma desvantagem dessa arquitetura é o versionamento das linhas que não serão mais utilizadas (também conhecidas como tuplas mortas), exigindo algum mecanismo de limpeza.
Para solucionar esse problema, o PostgreSQL utiliza um recurso chamado VACUUM, que é responsável por efetuar essa limpeza. Esse recurso pode ser acionado manualmente por comandos simples ou de forma automática através do Autovacuum.
Neste texto, você poderá entender um pouco mais sobre o VACUUM e também sobre as melhorias implementadas na versão 16 do PostgreSQL, que foi lançada no dia 31 de agosto de 2023.
Quais são os tipos de Vacuum?
Antes de tudo é preciso compreender que o Vacuum no PostgreSQL apresenta algumas variações básicas. Aqui estão as principais:
VACUUM
De maneira simplificada, o VACUUM é uma ferramenta muito útil para identificar registros não utilizados no banco de dados, permitindo a recuperação de espaço em disco e melhorando o desempenho das consultas. Este comando pode operar em paralelo com a leitura e escrita normais da tabela, pois o Postgres não obtém um bloqueio exclusivo das tuplas desta tabela que sofre o VACUUM. Contudo, na maioria dos casos, o espaço extra não é devolvido ao sistema operacional; ele permanece disponível para reutilização na mesma tabela.
No PostgreSQL, os registros não são deletados fisicamente, mas marcados como inúteis, prática comum em diversas aplicações. De maneira geral, a ideia é tornar as operações de update mais eficientes e evitar um crescimento desnecessário da tabela, por isso entender a dinâmica do modelo de negócio é importante, assim como optar pela técnica do VACUUM mais adequada para cada banco de dados.
VACUUM FULL
O VACUUM FULL faz uma recriação de toda a tabela (objeto), deixando-a somente com registros válidos, pois ele grava uma nova cópia da tabela e não libera a tabela antiga até concluir a operação. Este procedimento requer cautela, pois é invasivo, precisa de espaço em disco suficiente, causa bloqueio da tabela e gera indisponibilidade de acesso durante sua execução. Dessa forma, é recomendável sempre programar uma janela de manutenção para esse tipo de procedimento.
Algumas empresas executam esse procedimento em situações bem específicas, como quando a base de dados atinge um tamanho considerável, com muitas tabelas, e existe a necessidade urgente de liberar espaço em disco, com a premissa de que downtime não prejudique os usuários. Uma dica importante: por questões de segurança, essa ação deve ser permitida apenas pelo superusuário do banco de dados e só pode ser executada de forma manual. Ou seja, nenhum processo do PostgreSQL executará um VACUUM FULL automático.
VACUUM FREEZE
O VACUUM FREEZE realiza um “congelamento” agressivo das linhas, essencialmente congelando o ID da transação para todas as páginas, independentemente de terem sido modificadas ou não. Isto faz com que todas as linhas atuais sejam vistas como antigas para todas as novas transações. Vale destacar que essa opção é sempre ativada ao usar o VACUUM FULL. Como citado anteriormente, o VACUUM FULL reescreve e corrige os dados, incluindo o VACUUM FREEZE. Embora sejam opções semelhantes, elas não são idênticas.
VACUUM VERBOSE
O VACUUM VERBOSE permite um acompanhamento de todas as ações que ocorrem durante o processo. Esse parâmetro possibilita a geração de um relatório detalhado de tudo o que está sendo executado pelo comando VACUUM.
O comando “VACUUM VERBOSE” é bastante útil para analisar possíveis falhas na execução do VACUUM ou até mesmo para conferir estatísticas após sua execução. Esse comando pode ser utilizado em conjunto com qualquer tipo de VACUUM. Exemplos: VACUUM VERBOSE FREEZE, VACUUM VERBOSE FULL.
VACUUM ANALYZE
Esta opção é responsável por atualizar as estatísticas usadas pelo planejador do plano de consultas. Embora possa ser acionada individualmente, quando em conjunto com o VACUUM traz uma excelente abordagem de otimização. Isso ocorre porque requer apenas o bloqueio de leitura da tabela, permitindo que as demais transações ocorram normalmente no banco de dados. E assim como o VACUUM VERBOSE, esse comando também pode ser utilizado em conjunto de qualquer tipo de VACUUM.
A execução coordenada do VACUUM e ANALYZE é essencial para manter atualizadas as estatísticas do banco de dados, possibilitando melhorar a performance nas pesquisas.
Autovacuum do PostgreSQL
Embora seja uma ferramenta opcional, é fortemente recomendado que esse processo nunca seja desativado em seu banco de dados. Essa funcionalidade, executada automaticamente pelo sistema gerenciador do PostgreSQL, realiza as operações de VACUUM e ANALYZE em segundo plano. O controle desse processo é realizado através dos valores definidos nos parâmetros de configuração.
O Autovacuum é nativo do PostgreSQL, permitindo a configuração para que o próprio banco execute o VACUUM simples (sem o FULL). É indicado para monitorar picos inesperados nas tabelas, devido às suas regras de verificação que determinam em quais tabelas as ações de limpeza devem ser executadas. Dessa forma se garante que todas tabelas (em todos os bancos de dados) que excedam estes valores sejam marcadas para o VACUUM. Esse processo conta com outros procedimentos integrados para seu funcionamento eficaz.
Existem outros tipos de VACUUM que você pode consultar aqui!
Entendendo as melhorias na atualização do PostgreSQL 16:
A partir desta versão, o VACUUM poderá ser utilizado ao fornecer apenas o nome do schema, possibilitando que a execução seja apenas nos objetos desse schema. Essa funcionalidade beneficia empresas que possuem uma organização de seus objetos agrupados por schema e têm a necessidade de realizar a manutenção desses objetos em conjunto.
Um exemplo desse cenário envolve clientes que usam o conceito de multi-tenancy baseado em schemas. Dessa forma, torna-se possível a execução da rotina de manutenção para clientes (schemas) de forma isolada, eliminando a necessidade de criação de recursos personalizados, como o uso de scripts ou blocos de código em pl/pgsql.
Outra implementação do VACUUM para a versão 16 é poder executar a rotina apenas para as tabelas TOAST. O comportamento padrão continua sendo a execução da rotina no objeto principal, o que é recomendado, mas agora há a opção de execução separada, caso necessário.
Dicas e Melhores Práticas
O VACUUM é um procedimento essencial para o desempenho ideal do PostgreSQL. Embora a configuração padrão do autovacuum venha habilitada seguindo métricas de valores globais, alguns cenários exigem que o seu uso seja ponderado ou que venha acompanhado da consultoria de um especialista DBA PostgreSQL. Alguns exemplos de cenários que exigem uma ação mais ponderada são: alto volume de alterações, cargas de dados, tamanho dos objetos, quantidade de tabelas, ou recursos disponíveis no servidor.
Não existe uma recomendação única de parametrização com valores exatos que atenda a todos os cenários. Cada caso é único, o que demanda um ajuste bem elaborado e contínuo. Nesse sentido, podemos ir de uma base com diversos problemas causados pela ausência do trabalho do autovacuum, causando impactos em todo o negócio, para uma situação que exige menos investimentos em infraestrutura e operações, aproveitando o melhor desempenho proporcionado por manutenções bem executadas.
Existem diversas estratégias para configuração e automatização da execução do VACUUM, mas a melhor abordagem é um ajuste customizado de autovacuum para cada tabela no seu banco de dados. Esses valores devem ser baseados em seu volume de alterações, tamanho da tabela, quantidade de recursos disponíveis, entre outras variáveis. Este é um trabalho contínuo que deve evoluir junto com o crescimento do banco de dados.
Como está o seu banco de dados? Já executou alguma operação de VACUUM? A Timbira pode te ajudar com uma consultoria especializada no PostgreSQL. Conte com o nosso time para ajudar o seu banco a performar e ser responsivo.