Na operação normal do PostgreSQL, as tuplas deletadas ou atualizadas (por um DELETE ou UPDATE) não são fisicamente removidas de suas tabelas, ficando presentes até o ponto em que um comando VACCUM seja realizado.
Desse jeito uma duvida que fica pra quem é novo no PostgreSQL é: precisa fazer vacuum sempre? Isso não é semelhante ao comando SHRINK do SQL Server, que pode ser usado, mas tem consequências?
A resposta é não. Esse procedimento é necessário pra reorganizar o espaço em disco de fato utilizado pela base, e portanto deve ser feito com regular periodicidade.
O que se põe como uma dificuldade talvez é que deixar pra realizar o VACUUM quando estiver com pouco espaço em disco não é uma boa idéia, visto que será necessário um espaço livre para o procedimento igual ao tamanho da maior tabela da base. Isso pode ser um inconveniente sério quando se trata de ambientes limitados em recursos.
O ideal é deixar uma tarefa agendada para que isso seja feito frequentemente. Diariamente pode ser o adequado, e pra fazer dessa forma, nos aproveitamos de um binário que encapsula o comando vacuum pela linha de comando, e usamos ele em agendamentos da cron.
No bash, como root, execute o seguinte comando:
# crontab -e -u postgre
e no texto da crontab, acrescente essa outra linha
0 0 * * * vacuumdb --all --analyze