Alguém pode explicar a diferença entre esses tipos de VACUUM
no PostgreSQL?
Eu li o documento, mas apenas diz que FULL
bloqueia as tabelas e FREEZE
"congela" as tuplas. Eu acho que é o mesmo. Estou errado?
Alguém pode explicar a diferença entre esses tipos de VACUUM
no PostgreSQL?
Eu li o documento, mas apenas diz que FULL
bloqueia as tabelas e FREEZE
"congela" as tuplas. Eu acho que é o mesmo. Estou errado?
Respostas:
Aqui está uma resposta curta e concisa.
O vácuo cheio 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 a vácuo marca o conteúdo de uma tabela com um carimbo de data / hora de transação muito especial que informa ao postgres que ele nunca precisa ser aspirado. Na próxima atualização, esse ID congelado desaparecerá.
Por exemplo, o banco de dados template0 é 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 atualizada, o daemon de autovacuum simplesmente passará por ela. Além disso, a proteção "wrap around" no postgresql também nunca será ativada nessa tabela.
tl; dr freezing marca uma tabela como não necessitando de manutenção autovac. A próxima atualização descongelará.
VACUUM FREEZE
requer um bloqueio exclusivo na mesa? Parece que deveria, caso contrário, você correria o risco de tornar as linhas de transações ativas visíveis globalmente. Eu posso estar entendendo errado ... #
Para explicar melhor o que Jayadevan escreveu.
A maneira como o Postgres trabalha com transações e para acompanhar os dados visíveis é comparando os 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 agrupadas e, portanto, a nova transação parecerá ter sido feita no passado (e, portanto, será visível em uma transação atual enquanto não deveria), enquanto transações mais antigas parecerão estar 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 que é antiga o suficiente para estar em risco de sofrer com essa envolvente uma identificação de transação especial que sempre é mais antiga que todas as transações. Você pode vê-lo como se os IDs de transação válidos variassem de 0 a 2147483647, ele definirá o ID de 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 funciona apenas 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
foi preterida e não deve ser usada. Em vez disso, existem os parâmetros vacuum_freeze_table_age
e autovacuum_freeze_max_age
que especificam quantas transações podem ocorrer antes que uma varredura completa esteja sendo feita na tabela (efetivamente faça um interno VACUUM FREEZE
na tabela).
VACUUM FREEZE
serem preteridos / desencorajados?
Copie / cole da resposta quando fiz a mesma pergunta - "o vácuo comum 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.
vácuo completo compacta uma relação recuperando todo o espaço vazio. Requer um bloqueio exclusivo e é ruim para os sistemas de produção em geral por causa disso.
Portanto, o objetivo do vácuo REGULAR não é recuperar espaço das tabelas, mas disponibilizá-lo para reutilização posteriormente. O objetivo do vácuo FULL é recuperar todo o espaço desperdiçado às custas de um bloqueio exclusivo e desempenho de db enquanto isso está acontecendo.
Portanto, como o vácuo regular não é projetado para recuperar tudo, você não deve se surpreender por não ter recuperado tudo. Experimente o seu experimento em conjuntos de dados maiores, com mais exclusões aleatórias etc. para ver a diferença entre vácuo regular e pleno ".
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
Para adicionar isso, o vácuo cheio criará realmente novos arquivos para a tabela (os arquivos existentes teriam diminuído para o tamanho 0). Assim, o sistema operacional pode recuperar o espaço.
VACUUM FREEZE
em particular.