Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Indici asincroni in Aurora SQL
Il CREATE INDEX ASYNC
comando crea un indice su una o più colonne di una tabella specificata. Questo comando è un'operazione DDL asincrona che non blocca altre transazioni. Quando si esegueCREATE INDEX ASYNC
, Aurora DSQL restituisce immediatamente un. job_id
È possibile monitorare lo stato di questo lavoro asincrono utilizzando la visualizzazione di sistema. sys.jobs
Mentre il processo di creazione dell'indice è in corso, è possibile utilizzare le procedure e i comandi seguenti:
sys.wait_for_job(job_id)
'your_index_creation_job_id'
-
Blocca la sessione corrente fino al completamento o all'esito negativo del processo specificato. Restituisce un valore booleano che indica l'esito positivo o negativo.
DROP INDEX
-
Annulla un processo di creazione dell'indice in corso.
Al termine della creazione dell'indice asincrono, Aurora DSQL aggiorna il catalogo di sistema per contrassegnare l'indice come attivo.
Nota
Tieni presente che le transazioni simultanee che accedono a oggetti nello stesso namespace durante questo aggiornamento potrebbero riscontrare errori di concorrenza.
Quando Aurora DSQL termina un'attività di indicizzazione asincrona, aggiorna il catalogo di sistema per mostrare che l'indice è attivo. Se altre transazioni fanno riferimento agli oggetti nello stesso namespace in questo momento, potresti visualizzare un errore di concorrenza.
Sintassi
CREATE INDEX ASYNC
utilizza la seguente sintassi.
CREATE [ UNIQUE ] INDEX ASYNC [ IF NOT EXISTS ] name ON table_name ( { column_name } [ NULLS { FIRST | LAST } ] ) [ INCLUDE ( column_name [, ...] ) ] [ NULLS [ NOT ] DISTINCT ]
Parametri
UNIQUE
-
Indica ad Aurora DSQL di verificare la presenza di valori duplicati nella tabella quando crea l'indice e ogni volta che si aggiungono dati. Se si specifica questo parametro, le operazioni di inserimento e aggiornamento che comporterebbero la duplicazione delle voci generano un errore.
IF NOT EXISTS
-
Indica che Aurora DSQL non deve generare un'eccezione se esiste già un indice con lo stesso nome. In questa situazione, Aurora DSQL non crea il nuovo indice. Nota che l'indice che stai cercando di creare potrebbe avere una struttura molto diversa dall'indice esistente. Se specificate questo parametro, il nome dell'indice è obbligatorio.
name
-
Il nome dell'indice. Non è possibile includere il nome dello schema in questo parametro.
Aurora DSQL crea l'indice nello stesso schema della tabella principale. Il nome dell'indice deve essere distinto dal nome di qualsiasi altro oggetto, ad esempio una tabella o un indice, nello schema.
Se non si specifica un nome, Aurora DSQL genera automaticamente un nome basato sul nome della tabella principale e della colonna indicizzata. Ad esempio, se si esegue
CREATE INDEX ASYNC on table1 (col1, col2)
, Aurora DSQL assegna automaticamente un nome all'indice.table1_col1_col2_idx
NULLS FIRST | LAST
-
Il criterio di ordinamento delle colonne nulle e non nulle.
FIRST
indica che Aurora DSQL deve ordinare le colonne nulle prima delle colonne non nulle.LAST
indica che Aurora DSQL deve ordinare le colonne nulle dopo le colonne non nulle. INCLUDE
-
Un elenco di colonne da includere nell'indice come colonne non chiave. Non è possibile utilizzare una colonna non chiave in una qualifica di ricerca basata sulla scansione dell'indice. Aurora DSQL ignora la colonna in termini di unicità di un indice.
NULLS DISTINCT | NULLS NOT DISTINCT
-
Speciifica se Aurora DSQL deve considerare i valori null come distinti in un indice univoco. L'impostazione predefinita è
DISTINCT
, il che significa che un indice univoco può contenere più valori nulli in una colonna.NOT DISTINCT
indica che un indice non può contenere più valori nulli in una colonna.
Note per l'utilizzo
Considera le linee guida seguenti:
-
Il
CREATE INDEX ASYNC
comando non introduce blocchi. Inoltre, non influisce sulla tabella di base utilizzata da Aurora DSQL per creare l'indice. -
Durante le operazioni di migrazione dello schema, la
sys.wait_for_job(job_id)
procedura è utile. Assicura che le operazioni DDL e DML successive abbiano come target l'indice appena creato.'your_index_creation_job_id'
-
Ogni volta che Aurora DSQL esegue una nuova attività asincrona, controlla la
sys.jobs
visualizzazione ed elimina le attività con uno stato pari o superiore a 30 minuti.completed
failed
Pertanto, mostrasys.jobs
principalmente le attività in corso e non contiene informazioni sulle attività precedenti. -
Se Aurora DSQL non riesce a creare un indice asincrono, l'indice rimane.
INVALID
Per gli indici univoci, le operazioni DML sono soggette a vincoli di unicità finché non si elimina l'indice. Si consiglia di eliminare gli indici non validi e di ricrearli.
Creazione di un indice: esempio
L'esempio seguente mostra come creare uno schema, una tabella e quindi un indice.
-
Create una tabella denominata
test.departments
.CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key NOT null, manager varchar(255), size varchar(4));
-
Inserite una riga nella tabella.
INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
-
Crea un indice asincrono.
CREATE INDEX ASYNC test_index on test.departments(name, manager, size);
Il
CREATE INDEX
comando restituisce un ID di lavoro, come illustrato di seguito.job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45y
job_id
indica che Aurora DSQL ha inviato un nuovo lavoro per creare l'indice. È possibile utilizzare la procedurasys.wait_for_job(job_id)
per bloccare altri lavori della sessione fino al termine o al timeout del lavoro.'your_index_creation_job_id'
Interrogazione dello stato di creazione dell'indice: esempio
Eseguite una query nella vista di sys.jobs
sistema per verificare lo stato di creazione dell'indice, come illustrato nell'esempio seguente.
SELECT * FROM sys.jobs
Aurora DSQL restituisce una risposta simile alla seguente.
job_id | status | details ----------------------------+------------+--------- vs3kcl3rt5ddpk3a6xcq57cmcy | completed | ihbyw2aoirfnrdfoc4ojnlamoq | processing |
La colonna dello stato può corrispondere a uno dei seguenti valori.
submitted |
processing |
failed |
completed |
---|---|---|---|
L'attività è stata inviata, ma Aurora DSQL non ha ancora iniziato a elaborarla. | Aurora DSQL sta elaborando l'operazione. | L'operazione non è riuscita. Per ulteriori informazioni, consulta la colonna dei dettagli. Se Aurora DSQL non è riuscita a creare l'indice, Aurora DSQL non rimuove automaticamente la definizione dell'indice. È necessario rimuovere manualmente l'indice con il comando. DROP INDEX |
Aurora DSQL |
È inoltre possibile interrogare lo stato dell'indice tramite le tabelle pg_index
del catalogo e. pg_class
In particolare, indisvalid
gli attributi indisimmediate
possono dirti in che stato si trova il tuo indice. Sebbene Aurora DSQL crei l'indice, lo stato iniziale è di. INVALID
Il indisvalid
flag dell'indice restituisce FALSE
of
, che indica che l'indice non è valido. Se il flag restituisce TRUE
ot
, l'indice è pronto.
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)
Errori di compilazione dell'indice univoco
Se il processo di creazione dell'indice univoco asincrono mostra uno stato non riuscito con i dettagliFound duplicate key while validating index for UCVs
, ciò indica che non è stato possibile creare un indice univoco a causa di violazioni del vincolo di unicità.
Per risolvere gli errori di creazione dell'indice univoco
-
Rimuovi tutte le righe della tabella principale che contengono voci duplicate per le chiavi specificate nell'indice secondario univoco.
-
Eliminate l'indice fallito.
-
Esegui un nuovo comando create index.
Rilevamento delle violazioni di unicità nelle tabelle primarie
La seguente query SQL consente di identificare i valori duplicati in una colonna specificata della tabella. Ciò è particolarmente utile quando è necessario applicare l'unicità a una colonna che attualmente non è impostata come chiave primaria o non ha un vincolo univoco, come gli indirizzi e-mail in una tabella utente.
Gli esempi seguenti mostrano come creare una tabella utenti di esempio, popolarla con dati di test contenenti duplicati noti e quindi eseguire la query di rilevamento.
Definire lo schema della tabella
-- 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 );
Inserisci dati di esempio che includono set di indirizzi e-mail duplicati
-- 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');
Esegui una query di rilevamento duplicata
-- 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;
Visualizza tutti i record con indirizzi e-mail duplicati
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)
Se provassimo ora l'istruzione di creazione dell'indice, fallirebbe:
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)