Uma vez VACUUM FULL
que as tabelas são bloqueadas, é inaceitável para nós em nosso ambiente de produção.
É possível executar apenas VACUUM
e nunca VACUUM FULL
em um sistema de produção?
Torna VACUUM
o espaço reutilizável para novos INSERT
s?
Uma vez VACUUM FULL
que as tabelas são bloqueadas, é inaceitável para nós em nosso ambiente de produção.
É possível executar apenas VACUUM
e nunca VACUUM FULL
em um sistema de produção?
Torna VACUUM
o espaço reutilizável para novos INSERT
s?
Para entender as diferenças entre
VACUUM
VACUUM ANALYZE
VACUUM FULL
,é necessário um conhecimento básico da arquitetura do PostgreSQL.
De vários9s 1 nos é dito que:
Isso leva ao que é chamado de "bloat" - ou seja, a tabela ficará maior, mesmo que o número de registros permaneça o mesmo por causa dessas tuplas mortas.
Do EnterpriseDB 2 , temos:
Isso é semelhante à exclusão de um arquivo no sistema de arquivos - o espaço é meramente marcado como reutilizável e nada é realmente excluído. Isso não importa - o importante a notar é que o espaço ocupado pela linha fica disponível novamente para o servidor PostgreSQL para aquela tabela!
A principal diferença entre
VACUUM
eVACUUM FULL
é que com umVACUUM FULL
, o espaço liberado também fica disponível para o sistema operacional! Isso pode ser útil se alguém desejar fazer um backup e estiver com pouco espaço em disco. A partir daqui :Então,
VACUUM FULL
é análogo a desfragmentar um arquivo de disco (considere um arquivo de disco ≡ tabela PostgreSQL), do Percona 3 temos:No entanto, essa reconstrução exige um Access Exclusive Lock , que como o manual aponta:
Obviamente, e como você aponta, uma reescrita completa da tabela não é boa para a produção. O manual ainda diz:
Então, respondendo suas 2 perguntas:
P. 1)
Sim, mas ainda mais importante , não é necessário um bloqueio de acesso exclusivo. A partir da documentação , descobrimos que:
Autovacuum é um
VACUUM
sem oFULL
e normalmente é configurado nopostgresql.conf
arquivo.VACUUM
leva um bloqueio SHARE UPDATE EXCLUSIVE.Novamente, do manual :
Ou como explicado por um colaborador experiente do PostgreSQL aqui :
O blog do EnterpriseDB mencionado acima fornece "Dicas de práticas recomendadas VACUUM and ANALYZE" - pessoalmente, eu normalmente aconselharia um
ANALYZE
after aVACUUM
para atualizar as estatísticas da tabela para o otimizador! Este artigo também pode ajudá-lo com decisões sobre quando você pode querer correrVACUUM
.P. 2)
A pergunta feita no assunto.
Sim, é possível nunca executá-lo, especialmente se o espaço em disco não for uma preocupação. No entanto, pode valer a pena, pois uma reescrita completa da tabela (juntamente com os índices) pode ter um impacto benéfico no desempenho da consulta - registros em ordem física podem levar a menos páginas que exigem varreduras!
Conclusão.
Esta é uma questão complexa e um artigo completo seria impossivelmente longo, mas eu recomendo que você leia as referências aqui (e também as páginas aqui , aqui , aqui (fator de preenchimento) e aqui ).
Claro, você não quer
VACUUM
interromper seus sistemas de produção em horários de pico. Decidir sobre a melhor estratégia é o mesmo que praticamente tudo em TI -"It depends!"
.Há espaço em disco e parâmetros de carga de E/S a serem levados em consideração e você terá que chegar a um compromisso que melhor se adapte a todas as partes interessadas.
1) o many9s é um excelente site para todas as coisas do PostgreSQL.
2) O EnterpriseDB também é um excelente site e a maior empresa PostgreSQL com um grande número de membros e colaboradores da equipe principal.
3) Percona, embora anteriormente uma empresa MySQL, agora também tem uma distribuição PostgreSQL, e eles patrocinam a promissora extensão pg_stat_monitor (veja também aqui ). Eles são altamente considerados.
Para superusuários, não podemos bloquear o vácuo completo e apenas o vácuo na mesa, não tornando o espaço reutilizável, temos que usar o vácuo completo para remover fisicamente a tupla morta.