REINDEX im laufenden Betrieb

Auf einer Tabelle mit ca. 170 Millionen Datensätze habe ich zwei Indexe. Diese belegen je ca. 5GB. Da ich ziemlich viele Updates mache, hat einer der Indexe ziemlich viel “Bloat” (ca. 1GB, avg_leaf_desnity: 61.21, leaf_fragmentation: 20.77).

Gibt es eine Möglichkeit ein REINDEX zu machen so das weiter von der Tabelle gelesen werden kann? Ich habe eine Website (nur Lesezugriff) die ich nicht während dem Prozess offline nehmen möchte.

Oder gibt es andere Möglichkeiten den Index aufzuräumen?

Christian

Wenn Du genug Plattenplatz hast, kannst Du einen zweiten Index mit der gleichen Spaltenliste aber anderem Namen anlegen zusammen mit der Option CONCURRENTLY. Wenn das fertig ist, kannst Du den alten Index einfach mit DROP INDEX löschen.

Nachtrag zu castorp: in aktuellen Versionen kannst Du das DROP INDEX auch concurrently machen.

Danke. Das klappt so tip top. Im Log sehe ich jetzt zwei neue Einträge:

LOG: Checkpoints passieren zu oft (alle 29 Sekunden)
TIPP: Erhöhen Sie eventuell den Konfigurationsparameter “max_wal_size”.

Das REINDEX dauerte etwa 12 Minuten. max_wal_size ist bei mir auf 2GB. Mein Server hat 8GB RAM. Hat das ein Zusammenhang und sollte ich den Wert für max_wal_size ändern?

Christian

wenn das nur bei dieser opertaion passiert, kannst das auch ignorieren. Es wird halt relativ viel transaction log geschrieben, was dann dazu führt, oft ein checkpoint ausgeführt werden muß.

Machst Du nun Reindex oder erstellst die Indexe wie vorgeschlagen neu?

Zum Testen habe ich die Indexe neu erstellt und dann den alten gelöscht (DROP CONCURRENTLY). Die Website lief während dieser Zeit ohne Probleme. Ich werde das für die Indices dieser Tabelle regelmässig ausführen.

Christian