Was passiert, wenn wir einer vorhandenen Tabelle mit einer großen Datenmenge einen Index hinzufügen?

11

Ich habe eine Tabelle, die ungefähr 15 Millionen Datensätze enthalten wird. Jetzt muss ich der Tabelle einen Index hinzufügen.

Das Hinzufügen eines Index dauert einige Zeit, um jeden Eintrag in der Tabelle zu aktualisieren.

Ich bin ziemlich verwirrt, ob das Hinzufügen des Index zu Ausfallzeiten führen wird.

Wenn ja, wie kann ich dann die Ausfallzeiten überwinden?

Harry Suren
quelle
2
Siehe Indizes gleichzeitig
erstellen

Antworten:

10

Mit plain CREATE INDEXwird die Tabelle für Schreibvorgänge gesperrt, jedoch nicht für Lesevorgänge.

Verwenden Sie CREATE INDEX CONCURRENTLYdiese Option , um Schreibsperren zu vermeiden.

Aus den PostgreSQL-DokumentenCREATE INDEX :

Wenn diese Option verwendet wird, erstellt PostgreSQL den Index ohne Sperren, die gleichzeitige Einfügungen, Aktualisierungen oder Löschungen in der Tabelle verhindern. Während ein Standard-Index-Build Schreibvorgänge (aber keine Lesevorgänge) für die Tabelle sperrt, bis dies abgeschlossen ist. Bei Verwendung dieser Option sind einige Einschränkungen zu beachten - siehe Erstellen von Indizes gleichzeitig .

Und genauer gesagt (wie @ypercube kommentiert ):

PostgreSQL unterstützt das Erstellen von Indizes, ohne Schreibvorgänge zu sperren . Diese Methode wird durch Angabe der CONCURRENTLYOption von aufgerufen CREATE INDEX. Wenn diese Option verwendet wird, muss PostgreSQL zwei Scans der Tabelle durchführen und außerdem auf alle vorhandenen Transaktionen warten, die möglicherweise den Index zum Beenden verwenden könnten. Daher erfordert diese Methode mehr Gesamtarbeit als eine Standard-Indexerstellung und dauert erheblich länger. Da der normale Betrieb jedoch fortgesetzt werden kann, während der Index erstellt wird, ist diese Methode nützlich, um neue Indizes in einer Produktionsumgebung hinzuzufügen.

Meine kühne Betonung.

Fabrizio Mazzoni
quelle