it-swarm.com.de

Sollte ich meine PostgreSQL-Datenbank manuell VACUUMEN, wenn Autovacuum aktiviert ist?

Ich verwende Software, die eine große PostgreSQL-Datenbank erstellt (es gibt eine Tabelle mit einer Million Zeilen), und die Entwickler sagen, ich sollte regelmäßig VACUUM und ANALYZE. Die Standardeinstellung für die PostgreSQL-Datenbank ist jedoch autovacuum aktiviert.

Soll ich überhaupt staubsaugen/analysieren? Was sind die Vorteile? Was ist der Unterschied zwischen automatischem und manuellem Vakuum?

In Pgadmin3 habe ich zum Beispiel Folgendes:
enter image description here

15
kissgyorgy

Ich stimme ETL zu, dass es keine kurze Antwort gibt. Größe ist nicht das einzige, was zählt - wir führen ziemlich große PostgreSQL OLTP-Datenbanken (mit einigen Tabellen> 100.000.000 Zeilen) unter hoher Last aus und verlassen uns derzeit nur auf Autovakuum.

Zwei Dinge scheinen mir jedoch wichtig zu sein:

  • Es scheint ein Konsens zu bestehen, dass das Autovakuum niemals ausgeschaltet werden sollte, es sei denn, Sie haben eine sehr genau definierte Arbeitslast in Ihrer Datenbank und wissen genau, was Sie tun sind dabei. Aber natürlich können Sie zusätzliche VACUUM und/oder ANALYZE ausführen.

  • Bevor ich zusätzliche VACUUM -Läufe in Betracht ziehe, würde ich überprüfen, wie das Autovakuum Schritt hält. Sie können überprüfen, ob Tabellen den Autovakuum-Schwellenwert überschreiten, indem Sie pg_stat_user_tables Und pg_class Abfragen. Ich habe eine solche Abfrage in einem anderen Thread gepostet, der von Interesse sein könnte: Aggressive Autovacuum on PostgreSQL .

    Leider ist es nicht so einfach (d. H. Im Moment nicht möglich), eine ähnliche Überprüfung für Autoanalyse-Schwellenwerte durchzuführen. Die Autoanalyse beginnt jedoch standardmäßig lange vor dem Autovakuum und ist viel billiger. Wenn Ihre Datenbank also mit dem Autovakuum Schritt halten kann, ist die Autoanalyse wahrscheinlich auch in Ordnung. Die letzten Daten der automatischen Analyse können auch von pg_stat_user_tables Abgefragt werden.

Einige Teile der (hervorragendsten) PostgreSQL-Dokumentation, die ich hilfreich fand:

12
pygrac

Autovacuum sollte es ziemlich gut abdecken, es sei denn, Sie haben etwas falsch konfiguriert. Andere Antworten decken das bereits ab.

Es gibt einen klar definierten Fall für HandbuchVACUUM (und vor allem: manuell ANALYZE), obwohl: temporäre Tabellen , sie werden vom Autovakuum-Dämon nicht berücksichtigt. Ich zitiere das Handbuch zu CREATE TABLE hier :

Der autovacuum daemon kann nicht auf temporäre Tabellen zugreifen und diese daher nicht saugen oder analysieren. Aus diesem Grund sollten geeignete Vakuum- und Analysevorgänge über Sitzungs-SQL-Befehle ausgeführt werden. Wenn beispielsweise eine temporäre Tabelle in komplexen Abfragen verwendet werden soll, ist es ratsam, ANALYZE für die temporäre Tabelle auszuführen, nachdem sie gefüllt wurde.

7

Darauf gibt es keine kurze Antwort, da dies von vielen Faktoren abhängt. Ist das System langsam? Berührt das automatische Vakuum tatsächlich diesen Tisch? usw.

Hier sind einige gute Links zu diesem Thema:

Um eine klare Entscheidung treffen zu können, müssen Sie die Datenbank selbst und weitere Details zu den Vorgängen kennen.

4
ETL

Ich glaube nicht, dass Sie manuell staubsaugen müssen, es sei denn, Sie sehen Leistungseinbußen. Ich würde jedoch dringend empfehlen, Ihre Vakuum- und Autovakuumeinstellungen zu überprüfen und an Ihre Bedürfnisse anzupassen

Führen Sie diese Abfrage aus, um Ihre aktuellen Einstellungen anzuzeigen:

SELECT *
FROM pg_settings 
WHERE name LIKE '%vacuum%'

Die meisten Felder sind selbsterklärend, aber hier ist eine Dokumentation dazu: https://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html

Ich würde sagen, dass Ihr Ziel darin bestehen sollte, Autovacuum so zu konfigurieren, dass der Müll konsistent gereinigt wird, aber Autovacuum nicht ständig laufen zu lassen

Die wichtigsten Einstellungen sind:

  • autovacuum_vacuum_scale_factor - bestimmt den Prozentsatz der Tupel, die tot sein können, bevor eine Bereinigung ausgelöst wird. Standardwert = 0,2
  • autovacuum_vacuum_threshold - Mindestanzahl toter Tupel, bevor die Bereinigung ausgelöst wird. Standardwert = 50

Der Schwellenwert verhindert, dass der Bereinigungsprozess für kleine Tabellen viel zu oft ausgelöst wird.

Die Standardeinstellungen funktionieren einwandfrei, es sei denn, Sie haben sehr große Tabellen. Einfach ausgedrückt, wenn Sie zufällig eine Tabelle mit 100 GB haben, werden Sie 20 GB Müll ansammeln, bevor das Autovakuum ausgelöst wird. Daher empfehle ich normalerweise, den Skalierungsfaktor niedrig einzustellen. Wie niedrig sollten Sie selbst bestimmen. Ich verwende 0,05 für mein aktuelles Projekt

Schwellenwerte können ebenfalls erhöht werden. Viele Anwendungen haben einige Tabellen, die häufig aktualisiert werden, und 50 Tupel sind nicht so viel. Eine Erhöhung auf 1000 sollte nicht zu Problemen führen, aber Sie sollten natürlich Ihren eigenen Fall berücksichtigen

Sie können auch das Autovakuum fein einstellen und für einige Ihrer Tabellen unterschiedliche Einstellungen vornehmen

ALTER TABLE your_table SET (autovacuum_vacuum_scale_factor = 0.05);

Wenn Sie scale_factor und Schwellenwerte konfigurieren, sollte dies in Ordnung sein. Sie können auch autovacuum_vacuum_cost_limit Erhöhen, was standardmäßig vacuum_cost_limit Entspricht, was auf 200 festgelegt ist. Dies ist eine sehr wichtige Funktion des Vakuums, die es nicht ermöglicht, alle Ressourcen zu verbrauchen und ermöglicht Ihrer Anwendung, auch während des Staubsaugens mit Daten zu arbeiten, aber der Standardwert ist zu niedrig. Eine Erhöhung auf 1000 sollte nicht zu erheblichen Verzögerungen führen, ermöglicht jedoch einen viel schnelleren Abschluss des Vakuumprozesses

Natürlich können Sie das Vakuum auch manuell betreiben. Im einfachsten Fall können Sie einen einfachen Cron-Job ausführen, der jede Nacht eine vollständige Bereinigung durchführt, wenn nicht häufig auf Ihre Datenbank zugegriffen wird

Ich hoffe, das hilft!

1
Hasan Ammori