Dead Tuple
Tupla morta
Un Dead Tuple è una riga in una tabella PostgreSQL che è stata aggiornata (UPDATE) o cancellata (DELETE) ma non è ancora stata rimossa fisicamente. Resta nelle pagine dati, occupando spazio su disco e rallentando le scansioni.
Come funziona #
Quando PostgreSQL esegue un UPDATE, non sovrascrive la riga originale: crea una nuova versione e marca la vecchia come “morta”. La vecchia riga resta fisicamente nella pagina dati finché il VACUUM non la pulisce. I dead tuples sono il prezzo del modello MVCC — necessari per garantire l’isolamento transazionale.
A cosa serve #
I dead tuples sono un indicatore chiave della salute di una tabella. La vista pg_stat_user_tables mostra n_dead_tup e last_autovacuum — se i dead tuples crescono più velocemente di quanto l’autovacuum riesca a pulire, la tabella ha un problema. Un dead_tuple_percent sopra il 20-30% è un segnale di allarme.
Cosa può andare storto #
Su una tabella con 500.000 update al giorno e il default di autovacuum (scale_factor 0.2), il VACUUM si attiva ogni 4 giorni. Nel frattempo i dead tuples si accumulano, le tabelle si gonfiano e le query rallentano progressivamente — il pattern “lunedì bene, venerdì disastro”.