Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Asynchrone Indizes in Aurora DSQL
Der CREATE INDEX ASYNC
Befehl erstellt einen Index für eine oder mehrere Spalten einer angegebenen Tabelle. Bei diesem Befehl handelt es sich um eine asynchrone DDL-Operation, die andere Transaktionen nicht blockiert. Wenn Sie es ausführenCREATE INDEX ASYNC
, gibt Aurora DSQL sofort a job_id
zurück.
Sie können den Status dieses asynchronen Jobs mithilfe der sys.jobs
Systemansicht überwachen. Während der Indexerstellung können Sie die folgenden Verfahren und Befehle verwenden:
sys.wait_for_job(job_id)
'your_index_creation_job_id'
-
Blockiert die aktuelle Sitzung, bis der angegebene Job abgeschlossen ist oder fehlschlägt. Gibt einen booleschen Wert zurück, der auf Erfolg oder Misserfolg hinweist.
DROP INDEX
-
Bricht einen laufenden Indexerstellungsauftrag ab.
Wenn die asynchrone Indexerstellung abgeschlossen ist, aktualisiert Aurora DSQL den Systemkatalog, um den Index als aktiv zu kennzeichnen.
Anmerkung
Beachten Sie, dass bei gleichzeitigen Transaktionen, die während dieser Aktualisierung auf Objekte im selben Namespace zugreifen, Parallelitätsfehler auftreten können.
Wenn Aurora DSQL eine asynchrone Indexaufgabe beendet, aktualisiert es den Systemkatalog, um anzuzeigen, dass der Index aktiv ist. Wenn andere Transaktionen zu diesem Zeitpunkt auf die Objekte im selben Namespace verweisen, wird möglicherweise ein Parallelitätsfehler angezeigt.
Syntax
CREATE INDEX ASYNC
verwendet die folgende Syntax.
CREATE [ UNIQUE ] INDEX ASYNC [ IF NOT EXISTS ] name ON table_name ( { column_name } [ NULLS { FIRST | LAST } ] ) [ INCLUDE ( column_name [, ...] ) ] [ NULLS [ NOT ] DISTINCT ]
Parameter
UNIQUE
-
Weist Aurora DSQL an, bei der Indexerstellung und bei jedem Hinzufügen von Daten nach doppelten Werten in der Tabelle zu suchen. Wenn Sie diesen Parameter angeben, wird bei Einfüge- und Aktualisierungsvorgängen, die zu doppelten Einträgen führen würden, ein Fehler generiert.
IF NOT EXISTS
-
Zeigt an, dass Aurora DSQL keine Ausnahme auslösen sollte, wenn bereits ein Index mit demselben Namen existiert. In dieser Situation erstellt Aurora DSQL den neuen Index nicht. Beachten Sie, dass der Index, den Sie zu erstellen versuchen, eine ganz andere Struktur als der bestehende Index haben kann. Wenn Sie diesen Parameter angeben, ist der Indexname erforderlich.
name
-
Der Indexname. Sie können den Namen Ihres Schemas nicht in diesen Parameter aufnehmen.
Aurora DSQL erstellt den Index im gleichen Schema wie die übergeordnete Tabelle. Der Name des Indexes muss sich vom Namen jedes anderen Objekts, z. B. einer Tabelle oder eines Indexes, im Schema unterscheiden.
Wenn Sie keinen Namen angeben, generiert Aurora DSQL automatisch einen Namen, der auf dem Namen der übergeordneten Tabelle und der indizierten Spalte basiert. Wenn Sie beispielsweise ausführen
CREATE INDEX ASYNC on table1 (col1, col2)
, benennt Aurora DSQL den Indextable1_col1_col2_idx
automatisch. NULLS FIRST | LAST
-
Die Sortierreihenfolge von Nullspalten und Spalten, die nicht Null sind.
FIRST
gibt an, dass Aurora DSQL Nullspalten vor Nicht-Null-Spalten sortieren sollte.LAST
gibt an, dass Aurora DSQL Nullspalten nach Nicht-Null-Spalten sortieren soll. INCLUDE
-
Eine Liste von Spalten, die als Nicht-Schlüsselspalten in den Index aufgenommen werden sollen. Sie können keine Nichtschlüsselspalte in einer Indexscan-Suchqualifikation verwenden. Aurora DSQL ignoriert die Spalte im Hinblick auf die Eindeutigkeit eines Indexes.
NULLS DISTINCT | NULLS NOT DISTINCT
-
Gibt an, ob Aurora DSQL Nullwerte in einem eindeutigen Index als unterschiedlich betrachten soll. Die Standardeinstellung ist
DISTINCT
, was bedeutet, dass ein eindeutiger Index mehrere Nullwerte in einer Spalte enthalten kann.NOT DISTINCT
gibt an, dass ein Index nicht mehrere Nullwerte in einer Spalte enthalten kann.
Nutzungshinweise
Berücksichtigen Sie die folgenden Hinweise:
-
Der
CREATE INDEX ASYNC
Befehl führt keine Sperren ein. Es hat auch keinen Einfluss auf die Basistabelle, die Aurora DSQL verwendet, um den Index zu erstellen. -
Bei Schemamigrationsvorgängen ist das
sys.wait_for_job(job_id)
Verfahren nützlich. Es stellt sicher, dass nachfolgende DDL- und DML-Operationen auf den neu erstellten Index abzielen.'your_index_creation_job_id'
-
Jedes Mal, wenn Aurora DSQL eine neue asynchrone Aufgabe ausführt, überprüft es die
sys.jobs
Ansicht und löscht Aufgaben, die einen Status voncompleted
oder länger alsfailed
30 Minuten haben. Zeigt alsosys.jobs
hauptsächlich Aufgaben an, die gerade bearbeitet werden, und enthält keine Informationen über alte Aufgaben. -
Wenn Aurora DSQL keinen asynchronen Index erstellen kann, bleibt der Index erhalten.
INVALID
Bei eindeutigen Indizes unterliegen DML-Operationen Eindeutigkeitsbeschränkungen, bis Sie den Index löschen. Es wird empfohlen, ungültige Indizes zu löschen und sie neu zu erstellen.
Einen Index erstellen: Beispiel
Das folgende Beispiel zeigt, wie Sie ein Schema, eine Tabelle und dann einen Index erstellen.
-
Erstellen Sie eine Tabelle mit dem Namen „
test.departments
“.CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key NOT null, manager varchar(255), size varchar(4));
-
Fügt eine Zeile in die Tabelle ein.
INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
-
Erstellen Sie einen asynchronen Index.
CREATE INDEX ASYNC test_index on test.departments(name, manager, size);
Der
CREATE INDEX
Befehl gibt eine Job-ID zurück, wie unten gezeigt.job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45y
Das
job_id
zeigt an, dass Aurora DSQL einen neuen Job zur Indexerstellung eingereicht hat. Sie können das Verfahren verwendensys.wait_for_job(job_id)
, um andere Arbeiten an der Sitzung zu blockieren, bis der Job abgeschlossen ist oder das Timeout überschritten wird.'your_index_creation_job_id'
Den Status der Indexerstellung abfragen: Beispiel
Fragen Sie die sys.jobs
Systemansicht ab, um den Erstellungsstatus Ihres Indexes zu überprüfen, wie im folgenden Beispiel gezeigt.
SELECT * FROM sys.jobs
Aurora DSQL gibt eine Antwort ähnlich der folgenden zurück.
job_id | status | details ----------------------------+------------+--------- vs3kcl3rt5ddpk3a6xcq57cmcy | completed | ihbyw2aoirfnrdfoc4ojnlamoq | processing |
Die Statusspalte kann einen der folgenden Werte haben.
submitted |
processing |
failed |
completed |
---|---|---|---|
Die Aufgabe wurde eingereicht, aber Aurora DSQL hat noch nicht begonnen, sie zu verarbeiten. | Aurora DSQL verarbeitet die Aufgabe. | Die Aufgabe ist fehlgeschlagen. Weitere Informationen finden Sie in der Detailspalte. Wenn Aurora DSQL den Index nicht erstellen konnte, entfernt Aurora DSQL die Indexdefinition nicht automatisch. Sie müssen den Index manuell mit dem DROP INDEX Befehl entfernen. |
Aurora SQL |
Sie können den Status des Indexes auch über die Katalogtabellen pg_index
und pg_class
abfragen. Insbesondere die Attribute indisvalid
und indisimmediate
können Ihnen sagen, in welchem Zustand sich Ihr Index befindet. Aurora DSQL erstellt zwar Ihren Index, hat aber den Anfangsstatus. INVALID
Das indisvalid
Kennzeichen für den Index gibt FALSE
oder zurückf
, was darauf hinweist, dass der Index nicht gültig ist. Wenn das Flag TRUE
oder zurückgibtt
, ist der Index bereit.
SELECT relname AS index_name, indisvalid as is_valid, pg_get_indexdef(indexrelid) AS index_definition from pg_index, pg_class WHERE pg_class.oid = indexrelid AND indrelid = 'test.departments'::regclass;
index_name | is_valid | index_definition ------------------+----------+------------------------------------------------------------------------------------------------------------------- department_pkey | t | CREATE UNIQUE INDEX department_pkey ON test.departments USING btree_index (title) INCLUDE (name, manager, size) test_index1 | t | CREATE INDEX test_index1 ON test.departments USING btree_index (name, manager, size)
Fehler bei der Erstellung eines eindeutigen Indexes
Wenn Ihr asynchroner Auftrag zur Erstellung eines eindeutigen Indexes den Status „Fehlgeschlagen“ mit den entsprechenden Details anzeigtFound duplicate key while validating index for UCVs
, deutet dies darauf hin, dass ein eindeutiger Index aufgrund von Verstößen gegen Eindeutigkeitsbeschränkungen nicht erstellt werden konnte.
Um Fehler bei der Erstellung eines eindeutigen Indexes zu beheben
-
Entfernen Sie alle Zeilen in Ihrer Primärtabelle, die doppelte Einträge für die in Ihrem eindeutigen sekundären Index angegebenen Schlüssel enthalten.
-
Löscht den fehlgeschlagenen Index.
-
Geben Sie einen neuen Befehl zum Erstellen eines Index ein.
Erkennung von Eindeutigkeitsverletzungen in Primärtabellen
Die folgende SQL-Abfrage hilft Ihnen dabei, doppelte Werte in einer bestimmten Spalte Ihrer Tabelle zu identifizieren. Dies ist besonders nützlich, wenn Sie die Eindeutigkeit einer Spalte erzwingen müssen, die derzeit nicht als Primärschlüssel festgelegt ist oder keine eindeutige Einschränkung hat, wie z. B. E-Mail-Adressen in einer Benutzertabelle.
Die folgenden Beispiele zeigen, wie Sie eine Beispielbenutzertabelle erstellen, sie mit Testdaten füllen, die bekannte Duplikate enthalten, und dann die Erkennungsabfrage ausführen.
Definieren Sie das Tabellenschema
-- Drop the table if it exists DROP TABLE IF EXISTS users; -- Create the users table with a simple integer primary key CREATE TABLE users ( user_id INTEGER PRIMARY KEY, email VARCHAR(255), first_name VARCHAR(100), last_name VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Fügen Sie Beispieldaten ein, die Sätze doppelter E-Mail-Adressen enthalten
-- Insert sample data with explicit IDs INSERT INTO users (user_id, email, first_name, last_name) VALUES (1, 'john.doe@example.com', 'John', 'Doe'), (2, 'jane.smith@example.com', 'Jane', 'Smith'), (3, 'john.doe@example.com', 'Johnny', 'Doe'), (4, 'alice.wong@example.com', 'Alice', 'Wong'), (5, 'bob.jones@example.com', 'Bob', 'Jones'), (6, 'alice.wong@example.com', 'Alicia', 'Wong'), (7, 'bob.jones@example.com', 'Robert', 'Jones');
Führen Sie eine Abfrage zur Erkennung doppelter Objekte
-- Query to find duplicates WITH duplicates AS ( SELECT email, COUNT(*) as duplicate_count FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.*, d.duplicate_count FROM users u INNER JOIN duplicates d ON u.email = d.email ORDER BY u.email, u.user_id;
Alle Datensätze mit doppelten E-Mail-Adressen anzeigen
user_id | email | first_name | last_name | created_at | duplicate_count ---------+------------------------+------------+-----------+----------------------------+----------------- 4 | akua.mansa@example.com | Akua | Mansa | 2025-05-21 20:55:53.714432 | 2 6 | akua.mansa@example.com | Akua | Mansa | 2025-05-21 20:55:53.714432 | 2 1 | john.doe@example.com | John | Doe | 2025-05-21 20:55:53.714432 | 2 3 | john.doe@example.com | Johnny | Doe | 2025-05-21 20:55:53.714432 | 2 (4 rows)
Wenn wir die Anweisung zur Indexerstellung jetzt ausprobieren würden, würde sie fehlschlagen:
postgres=> CREATE UNIQUE INDEX ASYNC idx_users_email ON users(email); job_id ---------------------------- ve32upmjz5dgdknpbleeca5tri (1 row) postgres=> select * from sys.jobs; job_id | status | details | job_type | class_id | object_id | object_name | start_time | update_time ----------------------------+-----------+-----------------------------------------------------+-------------+----------+-----------+------------------------+------------------------+------------------------ qpn6aqlkijgmzilyidcpwrpova | completed | | DROP | 1259 | 26384 | | 2025-05-20 00:47:10+00 | 2025-05-20 00:47:32+00 ve32upmjz5dgdknpbleeca5tri | failed | Found duplicate key while validating index for UCVs | INDEX_BUILD | 1259 | 26396 | public.idx_users_email | 2025-05-20 00:49:49+00 | 2025-05-20 00:49:56+00 (2 rows)