it-swarm.com.de

Postgres; Indizieren Indizes neue Daten automatisch neu?

Wenn eine Postgres-Tabelle mehrere Zeilen enthält und dann einen Index erstellt, wird der Index automatisch aktualisiert, wenn nach seiner Erstellung neue Datenzeilen eingefügt werden?

Wird REINDEX alternativ nur in einigen selteneren Szenarien benötigt oder wenn neue Daten hinzugefügt werden?

7
Tommy

Neue Daten werden automatisch indiziert. Beachten Sie jedoch, dass das Vorhandensein eines Index daher inserts und updates verlangsamt (und natürlich auch deletes). Bei Tabellen mit einem extrem hohen Transaktionsvolumen müssen Sie beim Hinzufügen von Indizes sehr vorsichtig sein. Für die meisten Tabellen in die meisten Systemen ist dies kein Problem.

reindex wird unter normalen Umständen selten benötigt. Von diesen seltenen Fällen ist das häufigste "Aufblähen", das durch viele Mutationen verursacht wird - normalerweise, wenn diese Mutationen dazu führen, dass Daten auf der Festplatte aus der "Mitte" entfernt und am "Ende" hinzugefügt werden.

4
Colin 't Hart

Lassen Sie mich das Dokumentation zitieren:

REINDEX erstellt einen Index unter Verwendung der in der Indextabelle gespeicherten Daten neu und ersetzt die alte Kopie des Index. Es gibt verschiedene Szenarien, in denen REINDEX verwendet werden kann:

  • Ein Index ist beschädigt und enthält keine gültigen Daten mehr. Obwohl dies theoretisch niemals passieren sollte, können Indizes in der Praxis aufgrund von Softwarefehlern oder Hardwarefehlern beschädigt werden. REINDEX bietet eine Wiederherstellungsmethode.

  • Ein Index ist „aufgebläht“, dh er enthält viele leere oder fast leere Seiten. Dies kann bei B-Tree-Indizes in PostgreSQL unter bestimmten ungewöhnlichen Zugriffsmustern auftreten. REINDEX bietet eine Möglichkeit, den Speicherplatzverbrauch des Index zu reduzieren, indem eine neue Version des Index ohne die toten Seiten geschrieben wird. Weitere Informationen finden Sie in Abschnitt 24.2.

  • Sie haben einen Speicherparameter (z. B. Füllfaktor) für einen Index geändert und möchten sicherstellen, dass die Änderung vollständig wirksam wird.

  • Eine Indexerstellung mit der Option CONCURRENTLY ist fehlgeschlagen und hat einen „ungültigen“ Index hinterlassen. Solche Indizes sind nutzlos, aber es kann praktisch sein, REINDEX zu verwenden, um sie neu zu erstellen. Beachten Sie, dass REINDEX keinen gleichzeitigen Build ausführt. Um den Index zu erstellen, ohne die Produktion zu beeinträchtigen, sollten Sie den Index löschen und den Befehl CREATE INDEX CONCURRENTLY erneut ausgeben.

Es wird nicht gesagt, dass REINDEX nach Routineprozeduren wie UPDATE oder INSERT aufgerufen werden muss.

Beantwortung Ihrer Frage "Wird der Index automatisch aktualisiert, wenn nach seiner Erstellung neue Datenzeilen eingefügt werden?" Ja, Indizes werden automatisch neu erstellt, sonst haben sie wenig Sinn. Das Neuerstellen von Indizes in der Datenbank OLTP ist Teil einer Transaktion. Aus diesem Grund kann INSERT/UPDATE/DELETE in einer Tabelle mit umfangreichen Indizes viel Zeit in Anspruch nehmen. Der Vorgang wird erst abgeschlossen, wenn die Indizes neu erstellt werden .

1
Ilya Konyukhov