SQL Academy · Lezione

MVCC e cause del bloat

Comprenda il controllo della concorrenza multiversione, perché si accumulano tuple morte e come le transazioni lunghe causano bloat.

Lezione 1 di 414 passaggi

MVCC e cause del bloat è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Che cos'è MVCC?

Controllo della concorrenza multiversione. Invece di usare i lock, PostgreSQL conserva più versioni di una riga. I lettori vedono uno snapshot coerente; le operazioni di scrittura creano nuove versioni senza bloccare i lettori.

Come funziona UPDATE

UPDATE non modifica la riga direttamente:

  1. Contrassegna la vecchia versione della riga come "morta" nella transazione T
  2. Scrive una nuova versione
  3. Le altre transazioni vedono la versione consentita dal rispettivo snapshot

Perché si crea bloat

Le versioni obsolete si accumulano. La tabella cresce anche se il numero di righe rimane stabile. Senza pulizia, le query analizzano progressivamente più righe obsolete.

Quando VACUUM recupera spazio

VACUUM contrassegna le righe obsolete come riutilizzabili (all'interno del file della tabella). NON riduce le dimensioni dei file, a meno che non siano completamente vuoti alla fine. VACUUM FULL riscrive la tabella: richiede un lock esclusivo ed è lento.

Autovacuum

PostgreSQL esegue autovacuum in background. Si attiva quando il numero di righe obsolete supera una soglia:

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

Carichi di lavoro che causano bloat

  • Traffico intenso di UPDATE su tabelle piccole o molto aggiornate
  • Grandi batch di DELETE (è necessario vacuum per liberare spazio)
  • Le transazioni di lunga durata bloccano vacuum (mantengono gli snapshot)
  • Le sessioni inattive durante una transazione accumulano righe obsolete nelle tabelle molto utilizzate

Diagnosi del bloat

L'estensione pgstattuple fornisce dati precisi:

CREATE EXTENSION pgstattuple;

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

SELECT * FROM pgstatindex('orders_user_id_idx');

Le transazioni lunghe bloccano vacuum

VACUUM può pulire solo le righe più vecchie della transazione attiva più datata. Una sessione inattiva durante una transazione per 4 ore lascia 4 ore di righe obsolete non recuperate.

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;

Protezione dal wraparound

Gli ID delle transazioni sono a 32 bit. Se autovacuum non riesce a tenere il passo, il cluster rischia il "wraparound" ed entra in modalità di sicurezza (VACUUM forzato). Monitori:

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

Eliminazione logica ≠ fisica

DELETE contrassegna le righe come obsolete; lo spazio può essere recuperato solo da VACUUM. I DELETE di massa seguiti dall'assenza di vacuum lasciano grandi quantità di righe obsolete.

Aggiornamenti HOT

Se aggiorna solo colonne non indicizzate e nella stessa pagina è disponibile uno spazio libero, PostgreSQL esegue un aggiornamento HOT (Heap-Only Tuple): nessuna modifica all'indice e meno bloat.

Riduzione del bloat

  • Mantenga brevi le transazioni
  • Eviti UPDATE estesi sulle colonne indicizzate (HOT non può entrare in azione)
  • Ottimizzi aggressivamente autovacuum sulle tabelle molto attive
  • Utilizzi pg_repack per riscrivere senza lock prolungati

Riepilogo

MVCC consente la concorrenza al prezzo dell'accumulo di tuple morte.

  • VACUUM pulisce le tuple morte
  • Autovacuum è essenziale: non lo disabiliti
  • Le transazioni lunghe bloccano la pulizia
  • Diagnostichi il problema con pgstattuple

Verifica rapida

Perché un UPDATE non riduce le dimensioni della tabella anche quando cambia una sola colonna?

Gratis per iniziare

Impara SQL con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
46
Lezioni
183

Domande Frequenti

La lezione «MVCC e cause del bloat» è gratuita?

Sì — il testo completo di «MVCC e cause del bloat» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «MVCC e cause del bloat»?

Comprenda il controllo della concorrenza multiversione, perché si accumulano tuple morte e come le transazioni lunghe causano bloat. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «MVCC e cause del bloat»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. MVCC e cause del bloat
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE e pg_statistic
  4. Scansioni solo indice e Visibility Map
← Torna a SQL Academy