Spiegare lo scopo dei processi vacuum e autovacuum

Completato

Quando viene aggiornata una riga, ogni aggiornamento è costituito da un inserimento e da un'eliminazione. I dati modificati vengono inseriti e la riga precedente viene eliminata. In PostgreSQL la riga originale viene mantenuta in modo da poter eseguire il rollback di una transazione in caso di problemi. Invece di eliminare la riga originale, la riga viene contrassegnata per l'eliminazione in un secondo momento, con la conseguente presenza di righe "morte" (o tuple) che sono ancora su disco ma non più necessarie.

Come dice il nome, il processo vacuum rimuove definitivamente queste righe, recuperando spazio altrimenti perso e aggiornando le statistiche.

Il processo di pulizia delle righe morte viene chiamato processo vacuum. Se queste righe rimanessero su disco, il database occuperebbe più spazio su disco di quanto necessario, condizione nota come "bloat" del database. Il processo VACUUM è importante per i motivi seguenti:

  • Per recuperare lo spazio su disco occupato da righe contrassegnate per l'eliminazione.
  • Per aggiornare le statistiche dei dati per l'uso da parte dello strumento di pianificazione delle query.
  • Per aggiornare la mappa di visibilità, che velocizza le analisi solo dell'indice.
  • Per proteggersi dalla perdita di dati vecchi a causa del wraparound dell'ID delle transazioni.

PostgreSQL usa un processo denominato vacuum per eliminare definitivamente le righe e recuperare lo spazio. Oltre a recuperare spazio, garantisce anche che gli indici siano efficaci.

Quando il processo vacuum viene attivato automaticamente, il processo è noto come autovacuum. La frequenza con cui occorre eseguire il processo dipende dal numero di operazioni di aggiornamento ed eliminazione. È anche possibile monitorare il numero di righe contrassegnate per l'eliminazione.

L'esecuzione periodica del processo vacuum garantisce di evitare:

  • Condizioni di "bloat", inclusi database e tabelle più grandi del necessario.
  • Indici di grandi dimensioni non ottimali.
  • Aumento delle operazioni di I/O.

Per monitorare il numero di righe "morte" in una tabella, è possibile eseguire una query SELECT:

SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;

Per eseguire manualmente il processo vacuum, digitare:

vacuum