Muss ich eine Tabelle nach dem Löschen vieler Zeilen neu indizieren und vakuumieren?

10

Ich verwende eine PostgreSQL-Datenbank mit mehreren Tabellen, in denen Protokollinformationen gespeichert sind. Diese Informationen dienen nur zu Berichtszwecken und werden in eine Datei kopiert und aus der Datenbank gelöscht, wenn sie älter als 30 Tage sind.

Es können Millionen von Zeilen gelöscht werden, und wir haben jedes Mal nach dem Löschen einen REINDEX ausgeführt.

Ist das ausreichend oder sollten wir auch eine VACUUM- oder VACUUM-ANALYSE durchführen? Oder ist der REINDEX nicht notwendig und wir sollten stattdessen einfach eine VACUUM- oder VACUUM-ANALYSE ausführen?

Wir verwenden PostgreSQL 8.2.3, das meines Erachtens kein automatisches Staubsaugen erlaubt.

Kuhgott
quelle
2
Möglicherweise möchten Sie eine Partitionierung in Betracht ziehen, siehe postgresql.org/docs/9.0/static/ddl-partitioning.html ; Dann können Sie einfach Partitionen fallen lassen und das Staubsaugen vermeiden.
Alex
3
Version 8.2.3 hat auto_vacuum, siehe Handbuch, aber Sie sollten so schnell wie möglich aktualisieren. Aktuelle 8.2-Version ist 8.2.17. Sie haben 14 Patches hinter sich, darunter einige Sicherheitspatches. Ein Upgrade auf 8.4 oder sogar 9.0 ist eine bessere Idee, auto_vacuum wurde verbessert.
Frank Heikens

Antworten:

13

Sie sollten eine VACUUM-ANALYSE durchführen, da die VACUUM die Wiederverwendung des von den gelöschten Daten genutzten Speicherplatzes ermöglicht und einen Transaktionsumbruch verhindert. Die ANALYZE aktualisiert die Planerstatistiken, was zu besseren Abfrageplänen für Ihre Berichtsabfragen führen sollte.

Ein REINDEX ist theoretisch nicht erforderlich, aber Sie können feststellen, dass dies zu einer besseren Leistung führt, da der Index zusammenhängend ist.

Die entsprechenden Dokumentationsseiten für 8.2 finden Sie hier (Routine-Neuindexierung) und hier (Routine-Staubsaugen) .

hmallett
quelle