VACUUM FREEZE vs. VACUUM CHEIO

18

Alguém pode explicar a diferença entre esses tipos de VACUUMno PostgreSQL?

Eu li o documento, mas apenas diz que FULLbloqueia as tabelas e FREEZE"congela" as tuplas. Eu acho que é o mesmo. Estou errado?

Christian Maíz
fonte
Você leu o documento? Isso seria uma oportunidade perfeita para incluir um link para o que você leu ...
Erwin Brandstetter

Respostas:

12

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á.

Scott Marlowe
fonte
Então, VACUUM FREEZErequer 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 ... #
9337 Parthian Shot
Nenhum congelamento a vácuo não ocorre, o vácuo está completo.
Scott Marlowe
6

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 FREEZEfoi preterida e não deve ser usada. Em vez disso, existem os parâmetros vacuum_freeze_table_agee autovacuum_freeze_max_ageque especificam quantas transações podem ocorrer antes que uma varredura completa esteja sendo feita na tabela (efetivamente faça um interno VACUUM FREEZEna tabela).

Jimmy Stenke
fonte
3
Como os documentos não mencionam VACUUM FREEZEserem preteridos / desencorajados?
Dezso
Interessante. Foi o que ocorreu nas versões entre 8.2 e 9.0. Talvez eles tenham removido a depreciação porque poderia ser uma boa característica.
Jimmy Stenke
1

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.

Jayadevan
fonte
2
A pergunta pede VACUUM FREEZEem particular.
Erwin Brandstetter
Verdadeiro - "diferença entre esses tipos de vácuo no PostgreSQL" - eu pensei que a pergunta era sobre diferenças entre os tipos de vácuo.
21413 Jayadevan