Frage


Ich habe ein Problem mit meiner Postgres-Datenbank. Ich führe umfangreiche Aktualisierungsabfragen (1000 pro Sekunde) für eine einzelne Tabelle (mit 3000 Einträgen) durch und sehe, dass die Größe dieser Tabelle immer größer wird.

Die Art und Weise, wie ich die Größe wiederherstelle, besteht darin, folgende Abfragen durchzuführen:

VACUUM FULL [TABLE];
REINDEX TABLE [TABLE];

Dadurch wird die Größe meiner [TABELLE] auf die ursprüngliche Größe zurückgesetzt.

Das funktioniert bei mir einwandfrei, aber das Problem besteht darin, dass ich den Anwendungsserver herunterfahren muss, um diese Abfragen auszuführen.Wenn ich sie bei aktivem Server ausführe, wird die Größe der [TABELLE] reduziert, aber nur ein wenig.

Mein Problem reduziert sich auf 2 Fragen:
1.Warum wächst diese Tabelle, wenn ich nur Aktualisierungen vornehme?
2.Wie könnte ich dieses Problem lösen, ohne meinen Anwendungsserver herunterzufahren?

Vielen Dank für Ihre Zeit und Ihre Antworten.

Aktualisieren:Postgres-Versionen sind von 8.3.x bis 9.x

Update-2:Das Problem bestand darin, dass eine Anwendung eine IDLE-Verbindung aufrechterhielt. Durch Beenden der Verbindung und Durchführen eines Vakuums wurden alle Probleme gelöst.

War es hilfreich?

Lösung

Der Grund dafür, dass Ihre Tabelle wächst, während nur Aktualisierungen vorgenommen werden, liegt darin, dass es sich bei PostgreSQL um „Tupel handelt, die durch eine Aktualisierung gelöscht oder veraltet sind“. werden nicht physisch entfernt von ihrem Tisch;sie bleiben vorhanden, bis ein VAKUUM erzeugt wird.“

Während Sie 1000 Zeilen pro Sekunde aktualisieren, stehen Ihre Aktualisierungen natürlich im Widerspruch VACUUM FULL und vielleicht REINDEX.

Sie sollten das wahrscheinlich nicht verwenden FULLMöglichkeit.Sehen:http://www.postgresql.org/docs/9.1/static/sql-vacuum.html

„Einfaches VAKUUM (ohne FULL) gewinnt einfach Platz zurück und stellt ihn zur Wiederverwendung zur Verfügung.Diese Form des Befehls kann parallel zum normalen Lesen und Schreiben der Tabelle ausgeführt werden, da keine exklusive Sperre erhalten wird.

Wenn dies nicht ausreicht, um Ihr Problem zu lösen, können Sie möglicherweise Folgendes hinzufügen VACUUM Und REINDEX dass Ihr Job von Ihrem Anwendungsserver gesteuert wird.Wechseln Sie dann regelmäßig von der Zeilenaktualisierung zur Ausführung von a VACUUM.

BEARBEITEN:Beachten Sie, dass 3 Kommentare darauf hingewiesen haben autovacuum als Prozess, der kontinuierlich ablaufen kann.Dezso erwähnte jedoch, dass die Konfiguration für eine hohe Last möglicherweise nicht einfach ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top