Alguém pode explicar a diferença entre esses tipos VACUUM
no PostgreSQL?
Eu li o documento, mas ele apenas diz que FULL
bloqueia as tabelas e FREEZE
"congela" as tuplas. Acho que é isso mesmo. Estou errado?
Alguém pode explicar a diferença entre esses tipos VACUUM
no PostgreSQL?
Eu li o documento, mas ele apenas diz que FULL
bloqueia as tabelas e FREEZE
"congela" as tuplas. Acho que é isso mesmo. Estou errado?
Aqui está uma resposta curta e concisa.
Vacuum full retira um bloqueio exclusivo e reconstrói a tabela para que não tenha blocos vazios (vamos fingir que o fator de preenchimento é 100% por enquanto).
O congelamento de vácuo marca o conteúdo de uma tabela com um carimbo de data e hora de transação muito especial que informa ao postgres que ele não precisa ser aspirado, nunca. Na próxima atualização, esse ID congelado desaparecerá.
Por exemplo, o banco de dados template0 está congelado porque nunca muda (por padrão, você não pode se conectar a ele).
De vez em quando, o daemon autovacuum verifica um banco de dados e suas tabelas para ver o que precisa ser aspirado. Se uma tabela for congelada a vácuo e nunca for atualizada, o daemon autovacuum simplesmente a passará. Além disso, a proteção "wrap around" no postgresql também nunca será ativada nessa tabela.
tl;dr freeze marca uma tabela como não necessitando de nenhuma manutenção de autovac. A próxima atualização irá descongelá-lo.
Para explicar melhor o que Jayadevan escreveu.
A maneira como o Postgres trabalha com transações e para acompanhar os dados visíveis é comparando IDs de transação internos. No entanto, como essas transações são um número inteiro de 32 bits, mais cedo ou mais tarde, elas serão quebradas e, portanto, a nova transação parecerá ter sido feita no passado (e, portanto, será visível em uma transação atual, embora não devesse), enquanto transações mais antigas parecerão que estão sendo feitas no futuro (e como o futuro ainda não existe, esses dados não serão mais visíveis).
O que o Postgres faz para combater esse problema é atribuir a cada linha com idade suficiente para correr o risco de sofrer com esse wraparound um id de transação especial que sempre é mais antigo que todas as transações. Você pode ver como se os IDs de transação válidos variassem de 0 a 2147483647, ele definirá o ID da transação para todas as linhas atuais como -1.
No entanto, como o vácuo é basicamente para marcar o espaço vazio para reutilização, ele só funciona nas páginas de dados que foram alteradas.
O que
VACUUM FREEZE
fazer é basicamente congelar 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.No entanto, a partir da versão 8.2
VACUUM FREEZE
foram descontinuados e não devem ser usados. Em vez disso, existem os parâmetrosvacuum_freeze_table_age
eautovacuum_freeze_max_age
isso especifica quantas transações podem ocorrer antes que uma varredura completa seja feita na tabela (efetivamente, faça uma internaVACUUM FREEZE
na tabela).Copie / cole da resposta quando fiz a mesma pergunta - "o vácuo regular marca o espaço vazio para reutilização e recupera o espaço vazio no final de uma relação. Portanto, se o espaço vazio estiver no meio etc, não poderá ser recuperado apenas reutilizado.
vacuo full compacta uma relação recuperando todo o espaço vazio. Requer um bloqueio exclusivo e é ruim para sistemas de produção em geral por causa disso.
Portanto, o objetivo do aspirador REGULAR não é recuperar espaço das mesas, mas disponibilizá-lo para reutilização posterior. O objetivo do vácuo FULL é recuperar todo o espaço desperdiçado às custas de um bloqueio exclusivo e desempenho de banco de dados enquanto está acontecendo.
Portanto, como o vácuo regular não foi projetado para recuperar tudo, você não deve se surpreender que ele não tenha recuperado tudo. Tente seu experimento em conjuntos de dados maiores com mais exclusões aleatórias, etc., para ver a diferença entre vácuo normal e completo."
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
Para adicionar a isso, o vácuo completo realmente criará novos arquivos para a tabela (os arquivos existentes seriam reduzidos para o tamanho 0). Assim, o sistema operacional pode recuperar o espaço.