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?
ANALYZE
die gemeldete Größe abnimmt.