Erläutern des Zwecks von „vacuum“ und „autovacuum“

Abgeschlossen

Wenn eine Zeile aktualisiert wird, besteht jede Aktualisierung aus einem Einfügevorgang und einem Löschvorgang. Die geänderten Daten werden eingefügt, und die alte Zeile wird gelöscht. In PostgreSQL wird die ursprüngliche Zeile beibehalten, sodass im Fall eines Problems ein Rollback für die Transaktion ausgeführt werden kann. Anstatt die ursprüngliche Zeile zu löschen, wird sie für das spätere Löschen markiert, was zu inaktiven Zeilen (oder Tupeln) führt, die sich noch auf dem Datenträger befinden, aber nicht mehr erforderlich sind.

Der passend bezeichnete vacuum-Prozess entfernt diese Zeilen dauerhaft, sodass Speicherplatz, der sonst verloren gehen könnte, wieder frei wird und Statistiken aktualisiert werden.

Der Prozess der Reinigung der inaktiven Zeilen wird als vacuum-Prozess bezeichnet. Wenn diese Zeilen auf dem Datenträger verbleiben, nimmt die Datenbank mehr benötigten Speicherplatz in Anspruch (dies wird als „Überfrachtung“ bezeichnet). Der VACUUM-Prozess ist aus den folgenden Gründen wichtig:

  • Freigeben des Speicherplatzes, der von Zeilen beansprucht wird, die zum Löschen markiert sind
  • Aktualisieren von Datenstatistiken für die Verwendung durch den Abfrageplaner
  • Aktualisieren der Sichtbarkeitszuordnung, die Indexüberprüfungen beschleunigt
  • Schutz vor Verlust sehr alter Daten aufgrund von Transaktions-ID-Wraparounds

PostgreSQL verwendet einen Prozess namens „vacuum“, um Zeilen endgültig zu löschen und den Speicherplatz wieder freizugeben. Zusätzlich zum Freigeben von Speicherplatz stellt der Prozess sicher, dass Indizes wirksam sind.

Wenn der vacuum-Prozess automatisch ausgelöst wird, wird er als autovacuum bezeichnet. Die Häufigkeit, mit der der Prozess ausgeführt werden muss, hängt von der Anzahl der Aktualisierungs- und Löschvorgänge ab. Sie können auch die Anzahl der Zeilen überwachen, die zum Löschen markiert sind.

Durch das regelmäßige Ausführen des vacuum-Prozesses wird Folgendes vermieden:

  • Überfrachtung, einschließlich Datenbanken und Tabellen, die größer sind als nötig
  • Große, suboptimale Indizes
  • Erhöhte E/A-Vorgänge

Um die Anzahl der inaktiven Zeilen in einer Tabelle zu überwachen, können Sie eine SELECT-Abfrage ausführen:

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

Um den vacuum-Prozess manuell auszuführen, geben Sie Folgendes ein:

vacuum