Sollte man vor dem REINDEXing in PostgreSQL 8.4 immer VACUUM ANALYZE?

8

Jeden Tag am frühen Morgen aktualisiert ein pgAgent-Job den Inhalt von Tabelle A aus Tabelle B in meiner PostgreSQL 8.4-Datenbank. Tabelle A enthält rund 140.000 Datensätze in 91 Spalten und zwei Indizes - einen als Teil des PRIMARY KEY und einen GIST-Index für eine POINT PostGIS-Geometriespalte.

Um den Vorgang etwas zu beschleunigen, löscht der Job den Index in der Geometriespalte, bevor die Datensätze in Tabelle A gelöscht und die Datensätze aus Tabelle B eingefügt werden. Anschließend wird der Index neu erstellt. Nachdem dies erledigt ist, kann der Autovacuum-Daemon arbeiten, wenn er Lust dazu hat (nach etwa zehn Minuten Vergleich der Jobstatistiken und Tabellenstatistiken für die Jobabschlusszeit und die Autovacuum-Laufzeit).

Als ich heute Morgen nach all dem auf dem Tisch nachgesehen hatte, sagten mir die Tabellenstatistiken, dass die Tabellengröße 272 MB, die TOAST-Tabellengröße 8192 Byte und die Indexgröße 23 MB betrug. Dies schien ziemlich groß zu sein, daher gab ich einen REINDEX-Befehl für die Tabelle aus und die Indexgröße betrug 9832 KB.

Meine Frage (n) lautet:

Warum reduziert der REINDEX anscheinend die Größe der Indizes so stark, wenn die Indizes (oder zumindest der Geometriespaltenindex) von Grund auf neu erstellt wurden? Sollte ich sicherstellen, dass die Tabelle gesaugt / analysiert wurde, bevor die Indizes erstellt werden? Ist es nicht ein Faktor, den Index auf den Primärschlüssel zu löschen? Was vermisse ich?

UrsineWelles
quelle
1
Hält Sie irgendetwas davon ab, auf 9.3 zu aktualisieren? Ansonsten erinnere ich mich nicht zu sehr an 8.4, aber kann es sein, dass sich die Größen nur unterscheiden, weil die Tabelle kürzlich nicht analysiert wurde? Ich würde (wenn möglich) prüfen, ob nach einer Ebene auch ANALYZEdie gemeldete Größe abnimmt.
Dekso
@dezso Wir können in naher Zukunft leider nicht auf eine neuere Version aktualisieren. Ich werde versuchen, bei der nächsten Gelegenheit nach einer der täglichen Aktualisierungen eine erneute Analyse durchzuführen. Sammelt ANALYZE Statistiken zu den Indizes?
UrsineWelles
@deszo Wenn Sie eine VAKUUMANALYSE ausgeben, die die Ergebnisse überprüft und dann REINDEXing ausführt, wird die Indexgröße drastisch reduziert.
UrsineWelles
Oder warum nicht direkt auf die aktuelle Version 9.4 umsteigen, während Sie sich mit dem Thema Upgrade befassen ? Postgres 8.4 hat 2014 EOL erreicht. Das Staubsaugen und Indizieren wurde seitdem viele Male überarbeitet und verbessert.
Erwin Brandstetter
@ErwinBrandstetter - wir kriechen hier auf ein Update zu ... Bald werden meine Kollegen ihre Software aktualisieren, damit sie auf Cadcorp SIS 8.0 aktualisieren können, wodurch wir wiederum auf Postgres (auf 9.3) aktualisieren können. Ich freue mich darauf, die Belohnungen für Staubsaugen und Indizieren zu ernten!
UrsineWelles

Antworten:

3

Wenn die Anweisung CREATE INDEX feststellt, dass eine andere Sitzung einen aktiven Snapshot enthält, der möglicherweise noch an den gelöschten Datensätzen interessiert ist, werden diese gelöschten Datensätze in den neuen Index aufgenommen.

Wenn ein REINDEX feststellt, dass eine andere Sitzung einen aktiven Snapshot enthält, der möglicherweise noch an den gelöschten Datensätzen interessiert ist, werden diese gelöschten Datensätze in den neuen Index aufgenommen.

Wenn ein VACUUM feststellt, dass eine andere Sitzung einen aktiven Snapshot enthält, der möglicherweise noch an den gelöschten Datensätzen interessiert ist, werden diese Datensätze in der Tabelle gespeichert. Und dann müssen REINDEX oder CREATE INDEX sie auch in den neuen Index übernehmen, solange der Snapshot noch vorhanden ist.

Sobald die gelöschten Zeilen vorhanden sind oder keine Snapshots mehr vorhanden sind, kann das VACUUM sie aus der Tabelle entfernen. Ein CREATE INDEX oder REINDEX konnte sie aber auch einfach nicht in den neuen Index übertragen, unabhängig davon, ob VACUUM es geschafft hatte, sie aus dem fähigen zu entfernen oder nicht.

In Ihrem Szenario besteht die Rolle des VAKUUMS zwischen dem anfänglichen CREATE INDEX und dem REINDEX wahrscheinlich nur darin, Zeit in Anspruch zu nehmen. Während dieser Zeit verschwindet Ihre lang laufende Transaktion hoffentlich von selbst und löscht den störenden Snapshot.

jjanes
quelle
Das muss es sein. Ich werde nach solchen Transaktionen Ausschau halten müssen.
UrsineWelles
Ist für Postgres 9.3 eine Neuindizierung erforderlich?
Munai Das Udasin
0

Nachdem Sie verschiedene Arbeitsreihenfolgen ausprobiert haben, scheint es, dass die Ausführung eines VACUUM vor einer REINDEX-Anweisung die einzige Möglichkeit ist, die Größe zu verringern, möglicherweise weil der nicht gesaugte Speicherplatz den Index erweitert (Indizierung gelöschter Datensätze?). Erzwingen einer Tabellenumschreibung mithilfe von

ALTER TABLE blah ALTER COLUMN whiffle SET DATA TYPE whiffle_type;

macht das Gleiche, da es den ungenutzten Raum räumt.

Wenn Sie VACUUM in der Mitte des Prozesses ausführen müssen, wird der Ablauf ein wenig unterbrochen, da ein VACUUM-Befehl außerhalb einer Transaktion ausgegeben werden muss.

UrsineWelles
quelle
Löschen oder kürzen Sie? Und haben Sie für diese Indizes einen Füllfaktor von 100 festgelegt?
David Aldridge
Hallo @DavidAldridge. Ich lösche anstatt abzuschneiden. Der Füllfaktor ist die Standardeinstellung.
UrsineWelles