Postgres stützt sich auf verschiedene Schlösser, um sicherzustellen, dass alle Transaktionen wie erwartet ausgeführt werden können. Die Transaktion, die zuerst ein Schloss erhält. Es sei denn, ein Rollback oder ein Verpflichtung wird durchgeführt, kann eine andere Transaktion aufgrund des Schlosses nicht vorgehen. Wir konzentrieren uns heute darauf, zu verstehen.
Wie funktioniert das Sperren?
Bevor Sie gleichzeitig in die Erstellung von Indizes eintauchen, lohnt es sich, zu verstehen, wie Postgres Sperren implementiert und wie sie sich auf die Transaktion auswirken.
Für diesen Fall erstellen wir eine Tabelle und initiieren eine Transaktion, um die Tabelle zu ändern, um eine neue Spalte hinzuzufügen. Aus dem folgenden Bild können wir erkennen, dass der Befehl SELECT in der zweiten PSQL -Shell den Befehl ausgewählt hat.
Dieser Fall tritt auf, weil die erste Transaktion eine Sperre ausgibt. Sie werden in einen ähnlichen Fall stoßen, wenn Sie gleichzeitig den Index nicht indexieren, wie wir im späteren Abschnitt sehen werden.
Wenn Sie jedoch einen Rollback -Befehl für die erste Transaktion ausgeben, können wir sofort feststellen, dass die Sperre veröffentlicht wird. Jetzt kann die zweite Transaktion ununterbrochen ablaufen.
So funktionieren Schlösser auf Tischen. Blöcke lesen und schreiben Transaktionen, wenn ein DDL -Befehl ausgeführt wird. Mit diesem Verständnis können wir gleichzeitig Indizes erstellen.
So verwenden Sie PostgreSQL, um einen Index gleichzeitig zu erstellen
Beim Erstellen von Indizes für PostgreSQL kann der Vorgang alle anderen Transaktionen schnell blockieren und zu Verlusten führen. Bei der Indexierung einer Tabelle sperrt Postgres sie an die Schreibvorgänge wie Aktualisierung und Änderung der Vorgänge, bis der Index Build abgeschlossen ist.
Die Indextransaktion kann abhängig von Ihrer Datenbankgröße Stunden oder lange Minuten dauern. Wenn Sie andere Transaktionen in einer Produktionsumgebung einsperrten. Wenn Sie ein solches Szenario haben, besteht die beste Lösung darin, gleichzeitig Indizes zu erstellen, was die Schlösser beseitigt.
Die gleichzeitige Indizierung stellt sicher, dass eine Transaktion andere Transaktionen nicht blockiert. Somit können normale Transaktionen in der Mitte eines Build -Prozesses auftreten. Wenn Sie bei der Indexierung gleichzeitig hinzufügen, scannt PostgreSQL die indizierte Tabelle und wartet auf die Beendigung aller Transaktionen. Daher dauert die gleichzeitige Indexierung länger, stellt jedoch sicher, dass in einer Produktionsumgebung keine Verzögerungen auftreten. Lassen Sie uns ein Beispiel für eine normale Indexierung sehen, um zu verstehen, wie das Sperren Chaos in einer Produktionsumgebung verursachen kann.
Hier haben wir eine Tabelle mit dem Namen "Details", in die wir auf unserer Postgres -Shell zugegriffen haben. Nehmen wir an, wir möchten einen „BTree“ -Index für eine Spalte erstellen. Wir können den folgenden Befehl ausführen:
Unser Index wird erfolgreich erstellt, weil wir es mit einer kleinen Tabelle zu tun haben.
Es könnte jedoch Stunden dauern, bis Sie sich in einer Live -Produktionsumgebung befinden. Wenn Sie eine andere PSQL -Shell öffnen und versuchen, in dieselbe Tabelle zu schreiben, antwortet die Shell erst, wenn die Indexierung abgeschlossen ist. Wenn jemand versucht, einen anderen Schreibvorgang zu aktualisieren, einzufügen oder eine weitere Schreibvorgang auszuführen, wird er gesperrt.
Ein solches Szenario kann durch gleichzeitiges Indizieren derselben Tabelle festgelegt werden. Das Folgende ist die Syntax, um einen Index gleichzeitig zu erstellen:
Erstellen Sie den Index gleichzeitig Indexname auf Tabellenname (Spaltenname)
Wenn wir den gleichen Index wiederholen wollen, den wir früher gemacht haben, aber in diesem Fall gleichzeitig wäre unser neuer Befehl wie folgt:
In diesem Fall, wenn die Indexierung länger dauert und wir eine andere Shell öffnen, um einen Schreibvorgang in der Tabelle auszuführen, die wir indexieren, konnten wir keinen Sperrfehler erhalten, da der Indexaufbau gleichzeitig durchgeführt wird.
Sie können auch einen "eindeutigen gleichzeitigen Index" erstellen, indem Sie das Schlüsselwort "eindeutig" hinzufügen. Einzigartige Indizierung beseitigt Redundanz und erhöht Fehler, wenn sie einen redundanten Spaltenwert erkennt.
Hier ist ein Beispiel für eine eindeutige gleichzeitige Indizierung:
Wenn Sie die Indextabelle anzeigen, werden Sie feststellen, dass die Indexierung erfolgreich aufgetreten ist, und Sie können sehen.
# \ d Tabellenname;Abschluss
Das Erstellen eines Index ohne gleichzeitigen Ansatz führt zu Verriegelung und Blockierung von Transaktionen. Wenn Sie jedoch gleichzeitig indexieren, wird der Indexbau abgeschlossen, ohne dass andere Transaktionen auftreten. Dieser Beitrag hilft Ihnen zu verstehen, wie das Sperren bei der Arbeit mit Tabellen in Postgres funktioniert. Darüber hinaus haben wir erklärt.