0Pricing
SQL Academy · Aula

MVCC e causas da fragmentação

Entenda o controle de concorrência multiversão, por que tuplas obsoletas se acumulam e como transações longas causam fragmentação.

MVCC e causas da fragmentação é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

O que é MVCC?

Controle de concorrência multiversão. Em vez de bloquear, o PostgreSQL mantém várias versões de uma linha. Os leitores veem um snapshot consistente; os escritores criam novas versões sem bloquear os leitores.

Como funciona um UPDATE

Um UPDATE não altera a linha no próprio lugar:

  1. Marca a versão antiga da linha como "morta" na transação T
  2. Grava uma nova versão
  3. As outras transações veem a versão permitida pelo snapshot delas

Por que ocorre o inchaço

As versões mortas se acumulam. A tabela cresce mesmo que a quantidade de linhas permaneça estável. Sem limpeza, as consultas examinam progressivamente mais linhas mortas.

Quando VACUUM recupera espaço

VACUUM marca as linhas mortas como reutilizáveis (dentro do arquivo da tabela). Ele NÃO reduz os arquivos, a menos que estejam completamente vazios no final. VACUUM FULL reescreve a tabela — bloqueio exclusivo e operação lenta.

Autovacuum

O PostgreSQL executa o autovacuum em segundo plano. Ele é acionado quando as linhas mortas ultrapassam um limite:

autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rows

Cargas de trabalho que causam inchaço

  • Grande volume de UPDATE em tabelas pequenas/quentes
  • Grandes lotes de DELETE (é necessário executar vacuum para liberar espaço)
  • Transações de longa duração bloqueiam o vacuum (mantêm snapshots)
  • Sessões ociosas em transação acumulam linhas mortas em tabelas ocupadas

Diagnosticando o inchaço

A extensão pgstattuple fornece números exatos:

CREATE EXTENSION pgstattuple;

SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.

SELECT * FROM pgstatindex('orders_user_id_idx');

Transações longas bloqueiam o vacuum

VACUUM só pode limpar linhas mais antigas que a transação ativa mais antiga. Uma sessão ociosa em transação durante 4 horas significa 4 horas de linhas mortas não recuperadas.

SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;

Proteção contra wraparound

Os IDs de transação têm 32 bits. Se o autovacuum não conseguir acompanhar, o cluster enfrentará um "wraparound" e entrará no modo de segurança (VACUUM forçado). Monitore:

SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;

Exclusão lógica ≠ física

DELETE marca as linhas como mortas; o espaço só pode ser recuperado pelo VACUUM. DELETEs em massa seguidos da ausência de vacuum deixam grandes conjuntos de linhas mortas.

Atualizações HOT

Se você atualizar apenas colunas não indexadas e houver um espaço livre na mesma página, o PostgreSQL fará uma atualização HOT (Heap-Only Tuple) — sem modificar o índice e com menos inchaço.

Reduzindo o inchaço

  • Mantenha as transações curtas
  • Evite operações de UPDATE abrangentes em colunas indexadas (HOT não pode ser ativado)
  • Ajuste agressivamente o VACUUM automático em tabelas muito atualizadas
  • Use pg_repack para reescrever sem bloqueios prolongados

Recapitulação

MVCC permite a simultaneidade ao custo do acúmulo de linhas obsoletas.

  • VACUUM limpa as linhas obsoletas
  • O VACUUM automático é essencial — não o desative
  • Transações longas bloqueiam a limpeza
  • Faça o diagnóstico com pgstattuple

Verificação rápida

Por que um UPDATE não reduz o tamanho da tabela mesmo quando apenas uma coluna é alterada?

Perguntas Frequentes

A aula “MVCC e causas da fragmentação” é grátis?

Sim — o texto completo de “MVCC e causas da fragmentação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “MVCC e causas da fragmentação”?

Entenda o controle de concorrência multiversão, por que tuplas obsoletas se acumulam e como transações longas causam fragmentação. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “MVCC e causas da fragmentação”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. MVCC e causas da fragmentação
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE e pg_statistic
  4. Varreduras somente por índice e mapa de visibilidade
← Voltar para SQL Academy