Explicar o propósito do vácuo e do autovácuo
Quando uma linha é atualizada, cada atualização é composta por uma inserção e uma exclusão. Os dados modificados são inseridos e a linha antiga é excluída. No PostgreSQL, a linha original é mantida para que uma transação possa reverter se houver um problema. Em vez de excluir a linha original, ela é marcada para exclusão mais tarde, resultando em linhas (ou tuplas) "mortas" que ainda estão no disco, mas não são mais necessárias.
O processo de vácuo apropriadamente chamado remove permanentemente essas linhas, recuperando espaço que poderia ser perdido e atualizando as estatísticas.
O processo de limpeza das linhas mortas é chamado de processo de vácuo. Se essas linhas fossem deixadas no disco, o banco de dados ocuparia mais espaço em disco necessário, conhecido como "inchaço" do banco de dados. O processo VACUUM é importante pelas seguintes razões:
- Para recuperar espaço em disco ocupado por linhas marcadas para exclusão.
- Para atualizar estatísticas de dados para uso pelo planejador de consultas.
- Para atualizar o mapa de visibilidade, que acelera as verificações somente de índice.
- Para proteger contra a perda de dados antigos devido ao wraparound de ID de transação.
O PostgreSQL usa um processo chamado vácuo para excluir permanentemente linhas e recuperar o espaço. Além de recuperar espaço, também garante que os índices sejam eficazes.
Quando o processo de vácuo é acionado automaticamente, o processo é conhecido como autovácuo. A frequência com que o processo precisa ser executado depende da quantidade de operações de atualização e exclusão. Você também pode monitorar o número de linhas marcadas para exclusão.
Executar o processo de vácuo periodicamente garante que você:
- Experimente o "inchaço", incluindo bancos de dados e tabelas maiores do que o necessário.
- Ter índices grandes e subótimos.
- Experiência aumentada de E/S.
Para monitorar o número de linhas "mortas" em uma tabela, você pode executar uma consulta SELECT:
SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;
Para executar o processo de vácuo manualmente, digite:
vacuum