Ich versuche, PostgreSQL dazu zu bringen, meine Datenbank aggressiv automatisch zu vakuumieren. Ich habe das automatische Vakuum derzeit wie folgt konfiguriert:
- autovacuum_vacuum_cost_delay = 0 #Kostenbasiertes Vakuum ausschalten
- autovacuum_vacuum_cost_limit = 10000 #Max value
- autovacuum_vacuum_threshold = 50 # Standardwert
- autovacuum_vacuum_scale_factor = 0.2 # Standardwert
Ich stelle fest, dass das automatische Vakuum nur aktiviert wird, wenn die Datenbank nicht geladen ist, sodass ich Situationen erlebe, in denen es weit mehr tote Tupel als lebende Tupel gibt. Ein Beispiel finden Sie im beigefügten Screenshot. Einer der Tische hat 23 lebende Tupel, aber 16845 tote Tupel warten auf Vakuum. Das ist verrückt!
Auto Vacuum wird aktiviert, wenn der Testlauf beendet ist und der Datenbankserver inaktiv ist. Dies ist nicht das, was ich möchte, da Auto Vacuum aktiviert werden soll, wenn die Anzahl der toten Tupel 20% der aktiven Tupel + 50 überschreitet, wie es die Datenbank getan hat konfiguriert. Das automatische Saugen im Leerlauf des Servers ist für mich unbrauchbar, da der Produktionsserver voraussichtlich über einen längeren Zeitraum hinweg 1000 Updates / Sek. Erreicht. Aus diesem Grund muss das automatische Saugen auch dann ausgeführt werden, wenn der Server ausgelastet ist.
Fehlt mir etwas? Wie kann ich das automatische Staubsaugen erzwingen, während der Server stark ausgelastet ist?
Aktualisieren
Könnte dies ein Sperrproblem sein? Bei den fraglichen Tabellen handelt es sich um Übersichtstabellen, die über einen After-Insert-Trigger aufgefüllt werden. Diese Tabellen sind im SHARE ROW EXCLUSIVE-Modus gesperrt, um gleichzeitiges Schreiben in dieselbe Zeile zu verhindern.