Frage

Ich bin derzeit am Aufräumen eine Tabelle mit 2 Indizes und 250 Millionen aktiven Zeilen und in etwa so viele tote Zeilen (oder mehr).Ich erteilte den Befehl VACCUM FULL ANALYSIEREN von meinem client-computer (laptop) auf meinem server.Es wurde noch über Ihr Geschäft für die letzten 3-4 Tage oder so;Ich Frage mich, ob es Ende Nächster Zeit denn ich habe viel zu tun!

Der server hat einen quad-code Xeon 2,66 GHz-Prozessor, 12 GB RAM und einem RAID-controller angeschlossen 2 x 146 GB 10K rpm SAS-Festplatten in einer RAID 1-Konfiguration;es ist unter Suse Linux.Ich Frage mich...

Nun, zunächst ist der VAKUUM-postmaster-Prozess scheint die Nutzung von nur einem Kern.Zweitens, ich bin nicht zu sehen, ein sehr hoher I/O-Schreibvorgänge in I/O idle-Zeit-Verhältnis.Drittens, aus Berufung procinfo, Kann ich hochrechnen, dass die VAKUUM-Prozess die meiste Zeit aufhält (88%) warten auf I/0.

Also, warum ist es nicht die Verwendung von mehr Kerne, durch die Fäden, um zu einer überlastung der RAID-controller (get high I/O-Schreibvorgänge, um im Leerlauf-Verhältnis)?Warum ist es warten auf I/O, wenn das I/O-Auslastung ist nicht hoch?Warum ist er nicht schneller zu gehen, mit all dieser macht/Ressourcen an Ihren Finger?Es scheint mir, dass das VAKUUM werden kann und sollte, Multithreading, vor allem, wenn es arbeitet an einem großen Tisch und es ist die einzige, die funktioniert!

Außerdem ist Ihr eine Möglichkeit zum konfigurieren von postgresql.conf zu lassen multithread wie Staubsauger?Kann ich es töten und profitieren immer noch von seiner partial clean-up?Ich muss arbeiten, auf, dass, Tisch.

[Ich bin mit PostgreSQL-8.1]

Thx nochmal

War es hilfreich?

Lösung

Sie sagen nicht, welche version von PostgreSQL, die Sie verwenden.Ist es möglich, es ist pre-8.0?

Ich hatte genau dieses gleiche Szenario.Ihre beste beste:

  • töten Sie die Vakuum -
  • zurück, den Tisch mit pg_dump -t-option
  • die Tabelle löschen
  • wiederherstellen der Tabelle

Wenn Sie mit 8.x, schauen Sie auf den autovacuum-Optionen.Vakuum ist single-threaded, es gibt nichts, was Sie tun können, um es verwenden auf mehrere threads.

Andere Tipps

Einige schnelle Tipps:

  • Führen Sie die VAKUUM-FULL-VERBOSE so können Sie, was Los ist.
  • Löschen aller Indizes vor dem VAKUUM.Es ist schneller, Sie neu zu bauen, als den Staubsauger.Sie müssen auch neu zu erstellen, jetzt und dann, weil das VAKUUM VOLL nicht gut genug ist (besonders auf solch einem alten PosgreSQL als 8.1).
  • Legen Sie die maintenance_work_mem wirklich hoch.
  • Verwenden Sie eine neuere PostgreSQL.Btw, 8.4 wird haben eine große Verbesserung in vacuuming.

Eine alternative zur VAKUUM ist auf sichern und wiederherstellen.

Edit:Seit 9.0 VAKUUM VOLLER schreibt die ganze Tabelle.Es ist im Grunde die gleiche Sache zu tun, als einen dump + wiederherstellen, so läuft die NEUINDIZIERUNG ist unnötig.

Sind Sie sicher, Sie haben nichts Laufenden könnte, Tabellen sperren und verhindern Vakuum von running ?

(Eh, es ist am besten zu verwenden vacuum_cost_delay so dass die Vakuum ist nicht störend für die Produktion.)

Alte VAKUUM-FULL ist ein fossil.Es ist ziemlich langsam zu, und Sie bekam zur NEUINDIZIERUNG danach.Benutzen Sie es nicht.Wenn Sie wirklich wollen, um defrag eine Tabelle, CLUSTER, oder dieses :

Lettssay haben Sie etwas Platz gelassen, das ist viel schneller als dump&laden :

CREATE TABLE newtable AS SELECT * FROM oldtable;
CREATE INDEX bla ON newtable( ... );
ALTER TABLE oldtable RENAME TO archive;
ALTER TABLE newtable RENAME TO oldtable;

Hinweis: dies wird keine Kopie Ihrer Einschränkungen.Sie können verwenden Sie die CREATE TABLE-WIE ...Sie zu kopieren.

Also, warum ist es nicht die Verwendung von mehr Kernen durch threads

pg dies nicht unterstützt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top