Index asynchrones dans Aurora DSQL - Amazon Aurora DSQL

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Index asynchrones dans Aurora DSQL

La commande CREATE INDEX ASYNC crée un index sur une ou plusieurs colonnes d’une table spécifiée. Cette commande est une opération DDL asynchrone qui ne bloque pas les autres transactions. Lorsque vous exécutez CREATE INDEX ASYNC, Aurora DSQL renvoie immédiatement un job_id.

Vous pouvez surveiller l’état de cette tâche asynchrone à l’aide de la vue système sys.jobs. Pendant que le travail de création d’index est en cours, vous pouvez utiliser les procédures et commandes suivantes :

sys.wait_for_job(job_id)'your_index_creation_job_id'

Bloque la session en cours jusqu’à ce que la tâche spécifiée soit terminée ou échoue. Renvoie une valeur booléenne indiquant la réussite ou l’échec.

DROP INDEX

Annule une tâche de création d’index en cours.

Lorsque la création de l’index asynchrone est terminée, Aurora DSQL met à jour le catalogue système pour marquer l’index comme actif.

Note

Notez que les transactions simultanées accédant à des objets dans le même espace de noms au cours de cette mise à jour peuvent rencontrer des erreurs de simultanéité.

Lorsqu’Aurora DSQL termine une tâche d’indexation asynchrone, il met à jour le catalogue système pour indiquer que l’index est actif. Si d’autres transactions font référence aux objets du même espace de noms à ce stade, une erreur de simultanéité peut apparaître.

Syntaxe

CREATE INDEX ASYNC utilise la syntaxe suivante.

CREATE [ UNIQUE ] INDEX ASYNC [ IF NOT EXISTS ] name ON table_name ( { column_name } [ NULLS { FIRST | LAST } ] ) [ INCLUDE ( column_name [, ...] ) ] [ NULLS [ NOT ] DISTINCT ]

Paramètres

UNIQUE

Indique à Aurora DSQL de vérifier les valeurs dupliquées dans la table lors de la création de l’index et à chaque fois que vous ajoutez des données. Si vous spécifiez ce paramètre, les opérations d’insertion et de mise à jour susceptibles d’entraîner des doublons génèrent une erreur.

IF NOT EXISTS

Indique qu’Aurora DSQL ne doit pas générer d’exception si un index portant le même nom existe déjà. Dans ce cas, Aurora DSQL ne crée pas le nouvel index. Notez que l’index que vous essayez de créer peut avoir une structure très différente de celle de l’index existant. Si vous spécifiez ce paramètre, le nom de l’index est obligatoire.

name

Nom de l’index. Vous ne pouvez pas inclure le nom de votre schéma dans ce paramètre.

Aurora DSQL crée l’index dans le même schéma que sa table parent. Le nom de l’index doit être distinct du nom de tout autre objet, tel qu’une table ou un index, dans le schéma.

Si vous ne spécifiez pas de nom, Aurora DSQL le génère automatiquement en fonction du nom de la table parent et de la colonne indexée. Par exemple, si vous exécutez CREATE INDEX ASYNC on table1 (col1, col2), Aurora DSQL nomme automatiquement l’index table1_col1_col2_idx.

NULLS FIRST | LAST

Ordre de tri des colonnes nulles et non nulles. FIRST indique qu’Aurora DSQL doit trier les colonnes nulles avant les colonnes non nulles. LAST indique qu’Aurora DSQL doit trier les colonnes nulles après les colonnes non nulles.

INCLUDE

Liste des colonnes à inclure dans l’index en tant que colonnes non clés. Vous ne pouvez pas utiliser une colonne non clé dans une qualification de recherche par analyse d’index. Aurora DSQL ignore la colonne en termes d’unicité pour un index.

NULLS DISTINCT | NULLS NOT DISTINCT

Spécifie si Aurora DSQL doit considérer les valeurs nulles comme distinctes dans un index unique. La valeur par défaut est DISTINCT, ce qui signifie qu’un index unique peut contenir plusieurs valeurs nulles dans une colonne. NOT DISTINCT indique qu’un index ne peut pas contenir plusieurs valeurs nulles dans une colonne.

Notes d’utilisation

Considérez les directives suivantes :

  • La commande CREATE INDEX ASYNC n’introduit pas de verrous. Cela n’affecte pas non plus la table de base qu’Aurora DSQL utilise pour créer l’index.

  • Lors des opérations de migration de schéma, la procédure sys.wait_for_job(job_id)'your_index_creation_job_id' est utile. Cela garantit que les opérations DDL et DML suivantes ciblent l’index nouvellement créé.

  • Chaque fois qu’Aurora DSQL exécute une nouvelle tâche asynchrone, il vérifie la vue sys.jobs et supprime les tâches dont le statut est completed ou failed pendant plus de 30 minutes. Ainsi, sys.jobs affiche principalement les tâches en cours et ne contient aucune information sur les anciennes tâches.

  • Si Aurora DSQL ne parvient pas à créer un index asynchrone, l’index reste INVALID. Pour les index uniques, les opérations DML sont soumises à des contraintes d’unicité jusqu’à ce que vous supprimiez l’index. Nous vous recommandons de supprimer les index non valides et de les recréer.

Création d’un index : exemple

L’exemple suivant montre comment créer un schéma, une table, puis un index.

  1. Créez une nouvelle table nommée test.departments.

    CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key NOT null, manager varchar(255), size varchar(4));
  2. Insérez une ligne dans la table.

    INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
  3. Créez un index asynchrone.

    CREATE INDEX ASYNC test_index on test.departments(name, manager, size);

    La commande CREATE INDEX renvoie un identifiant de tâche, comme indiqué ci-dessous.

    job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45y

    job_id indique qu’Aurora DSQL a soumis une nouvelle tâche pour créer l’index. Vous pouvez utiliser la procédure sys.wait_for_job(job_id)'your_index_creation_job_id' pour bloquer d’autres tâches au cours de la session jusqu’à cette tâche soit terminée ou expire.

Interrogation de l’état de création de l’index : exemple

Interrogez la vue système sys.jobs pour vérifier l’état de création de votre index, comme illustré dans l’exemple suivant.

SELECT * FROM sys.jobs

Aurora DSQL renvoie une réponse semblable à ce qui suit.

job_id | status | details ----------------------------+------------+--------- vs3kcl3rt5ddpk3a6xcq57cmcy | completed | ihbyw2aoirfnrdfoc4ojnlamoq | processing |

La colonne d’état peut avoir l’une des valeurs suivantes.

submitted processing failed completed
La tâche est envoyée, mais Aurora DSQL n’a pas encore commencé à la traiter. Aurora DSQL est en train de traiter la tâche. La tâche a échoué. Consultez la colonne « détails » pour plus d’informations. Si Aurora DSQL ne parvient pas à créer l’index, Aurora DSQL ne supprime pas automatiquement la définition de l’index. Vous devez supprimer manuellement l’index à l’aide de la commande DROP INDEX. Aurora DSQL

Vous pouvez également interroger l’état de l’index via les tables du catalogue pg_index et pg_class. Plus précisément, les attributs indisvalid et indisimmediate peuvent vous indiquer dans quel état se trouve votre index. Lors de la création de votre index par Aurora DSQL, celui-ci possède l’état initial INVALID. L’indicateur indisvalid de l’index renvoie FALSE ou f, ce qui indique que l’index n’est pas valide. Si l’indicateur revient à TRUE ou t, l’index est prêt.

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)

Défaillances de création d’index uniques

Si votre tâche de création d’index unique asynchrone indique un état d’échec avec le détail Found duplicate key while validating index for UCVs, cela indique qu’un index unique n’a pas pu être créé en raison de violations des contraintes d’unicité.

Résolution des problèmes de défaillances de création d’index uniques
  1. Supprimez toutes les lignes de votre table principale contenant des entrées dupliquées pour les clés spécifiées dans votre index secondaire unique.

  2. Supprimez l’index défaillant.

  3. Émettez une nouvelle commande de création d’index.

Détection des violations d’unicité dans les tables principales

La requête SQL suivante vous aide à identifier les valeurs dupliquées dans une colonne spécifiée de votre table. Cela est particulièrement utile lorsque vous devez appliquer l’unicité à une colonne qui n’est pas actuellement définie comme clé primaire ou qui n’a pas de contrainte unique, telle que les adresses e-mail dans une table utilisateur.

Les exemples ci-dessous montrent comment créer un exemple de table des utilisateurs, la remplir avec des données de test contenant des doublons connus, puis exécuter la requête de détection.

Définir le schéma de table

-- 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 );

Insérer des exemples de données comprenant des ensembles d’adresses e-mail dupliquées

-- 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');

Exécuter une requête de détection des doublons

-- 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;

Afficher tous les enregistrements contenant des adresses e-mail dupliquées

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)

Si nous devions essayer l’instruction de création d’index maintenant, elle échouerait :

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)