

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.

# Gestion des index secondaires globaux dans DynamoDB
<a name="GSI.OnlineOps"></a>

Cette section décrit comment créer, modifier et supprimer des index secondaires globaux dans Amazon DynamoDB.

**Topics**
+ [Création d’une table avec des index secondaires globaux](#GSI.Creating)
+ [Description des index secondaires globaux sur une table](#GSI.Describing)
+ [Ajout d’un index secondaire global à une table existante](#GSI.OnlineOps.Creating)
+ [Suppression d’un index secondaire global](#GSI.OnlineOps.Deleting)
+ [Modification d’un index secondaire global pendant la création](#GSI.OnlineOps.Creating.Modify)

## Création d’une table avec des index secondaires globaux
<a name="GSI.Creating"></a>

Pour créer une table avec un ou plusieurs index secondaires globaux, utilisez l’opération `CreateTable` avec le paramètre `GlobalSecondaryIndexes`. Pour bénéficier d’une flexibilité de requête maximum, vous pouvez créer jusqu’à 20 index secondaires globaux (quota par défaut) par table. 

Vous devez spécifier un attribut faisant office de clé de partition d’index. Vous pouvez éventuellement spécifier un autre attribut pour la clé de tri d’index. Il n’est pas nécessaire que l’un de ces attributs de clé soit identique à un attribut de clé dans la table. Par exemple, dans le *GameScores*tableau (voir[Utilisation d’index secondaires globaux dans DynamoDB](GSI.md)), il n'`TopScoreDateTime`y a `TopScore` pas non plus d'attributs clés. Vous pouvez créer un index secondaire global avec une clé de partition `TopScore` et une clé de tri `TopScoreDateTime`. Vous pouvez utiliser un tel index pour déterminer s’il existe une corrélation entre les scores d’une partie et l’heure de la journée à laquelle celle-ci est jouée.

Chaque attribut de clé d’index doit être un scalaire de type `String`, `Number` ou `Binary` (il ne peut pas être de type document ou ensemble). Vous pouvez projeter des attributs de tout type de données dans un index secondaire global. Celui-ci inclut des scalaires, des documents et des ensembles. Pour obtenir la liste complète des types de données, consultez [Types de données](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes).

Si vous utilisez le mode approvisionné, vous devez fournir les paramètres `ProvisionedThroughput` pour l’index, à savoir `ReadCapacityUnits` et `WriteCapacityUnits`. Ces paramètres de débit approvisionné sont distincts de ceux de la table, mais se comportent de la même manière. Pour de plus amples informations, veuillez consulter [Considérations sur le débit alloué pour les index secondaires globaux](GSI.md#GSI.ThroughputConsiderations).

 Les index secondaires globaux héritent du mode read/write capacité de la table de base. Pour de plus amples informations, veuillez consulter [Considérations relatives au changement de mode de capacité dans DynamoDB](bp-switching-capacity-modes.md). 

**Note**  
 Lors de la création d’un nouvel index secondaire global, il peut être important de vérifier si la clé de partition de votre choix produit une distribution inégale ou réduite des données ou du trafic entre les valeurs des clés de partition du nouvel index. Si cela se produit, vous pourriez voir des opérations de remplissage et d’écriture se produire en même temps et limiter les écritures dans la table de base. Le service prend des mesures pour minimiser l’éventualité de ce scénario, mais il n’a aucune idée de la forme des données client par rapport à la clé de partition d’index, à la projection choisie ou à la rareté de la clé primaire d’index.  
Si vous pensez que votre nouvel index secondaire global peut présenter des données ou une distribution de trafic étroites ou asymétriques entre les valeurs des clés de partition, tenez compte des points suivants avant d’ajouter de nouveaux index à des tables importantes sur le plan opérationnel.  
Il peut être plus sûr d’ajouter l’index au moment où votre application génère le moins de trafic.
Envisagez d'activer CloudWatch Contributor Insights sur votre table de base et vos index. Cela vous procurera des informations précieuses sur la distribution de votre trafic.
 Surveillez `WriteThrottleEvents` et `ThrottledRequests` mesurez `OnlineIndexPercentageProgress` CloudWatch tout au long du processus. Ajustez la capacité d'écriture allouée selon les besoins pour terminer le remblayage dans un délai raisonnable sans aucun effet de limitation significatif sur vos opérations en cours. `OnlineIndexConsumedWriteCapacity`et `OnlineThrottleEvents` devraient afficher 0 lors du remblayage de l'indice.
Préparez-vous à annuler la création de l'index si vous subissez un impact opérationnel dû à la limitation des écritures.

## Description des index secondaires globaux sur une table
<a name="GSI.Describing"></a>

Pour afficher l’état de tous les index secondaires globaux sur une table, utilisez l’opération `DescribeTable`. La portion `GlobalSecondaryIndexes` de la réponse affiche tous les index sur la table, ainsi que l’état actuel de chacun d’eux (`IndexStatus`).

L’état `IndexStatus` d’un index secondaire global peut être l’un des suivants :
+ `CREATING` – L’index est en cours de création et n’est pas encore disponible pour utilisation.
+ `ACTIVE` – L’index est prêt pour utilisation et les applications peuvent effectuer des opérations `Query` dessus.
+ `UPDATING` – Les paramètres de débit approvisionné de l’index sont en cours de modification.
+ `DELETING` – L’index est actuellement en cours de suppression et ne peut plus être utilisé.

Quand DynamoDB a fini de générer un index secondaire global, l’état de celui-ci passe de `CREATING` à `ACTIVE`.

## Ajout d’un index secondaire global à une table existante
<a name="GSI.OnlineOps.Creating"></a>

Pour ajouter un index secondaire global à une table existante, utilisez l’opération `UpdateTable` avec le paramètre `GlobalSecondaryIndexUpdates`. Vous devez fournir les informations suivantes :
+ Un nom d’index. Le nom doit être unique parmi tous les index sur cette table.
+ Le schéma de clé de l’index. Vous devez spécifier un attribut pour la clé de partition d’index. Vous pouvez éventuellement spécifier un autre attribut pour la clé de tri d’index. Il n’est pas nécessaire que l’un de ces attributs de clé soit identique à un attribut de clé dans la table. Les types de données pour chaque attribut de schéma doivent être scalaires : `String`, `Number` ou `Binary`.
+ Attributs à projeter à partir de la table dans l’index :
  + `KEYS_ONLY` – Chaque élément de l’index se compose uniquement des valeurs de clé de partition et de tri de la table, ainsi que des valeurs de clé d’index. 
  + `INCLUDE` – En plus des attributs décrits dans `KEYS_ONLY`, l’index secondaire inclut des attributs autres que de clé que vous spécifiez.
  + `ALL` – L’index inclut tous les attributs de la table source.
+ Les paramètres de débit approvisionné pour l’index, à savoir `ReadCapacityUnits` et `WriteCapacityUnits`. Ces paramètres de débit approvisionné sont distincts de ceux de la table.

Vous ne pouvez créer qu'un seul index secondaire global par opération `UpdateTable`.

### Phases de création d'index
<a name="GSI.OnlineOps.Creating.Phases"></a>

Lorsque vous ajoutez un nouvel index secondaire global à une table existante, la table reste disponible pendant la création de l’index. Toutefois, le nouvel index n’est pas disponible pour les opérations Query tant que son état n’est pas passé de `CREATING` à `ACTIVE`.

**Note**  
La création d’un index secondaire global n’utilise pas la scalabilité automatique des applications. L’augmentation de la capacité de scalabilité automatique des applications `MIN` ne réduit pas le temps de création de l’index secondaire global.

En coulisses, DynamoDB génère l’index en deux phases :

**Allocation de ressources**  
DynamoDB alloue les ressources de calcul et de stockage nécessaires à la génération de l’index.  
Au cours de la phase d’allocation des ressources, l’attribut `IndexStatus` est `CREATING`, et l’attribut `Backfilling` a la valeur false. Utilisez l’opération `DescribeTable` pour récupérer l’état d’une table et de tous ses index secondaires.  
Pendant que l’index est en phase d’allocation de ressources, vous ne pouvez pas supprimer l’index ou sa table parent. Vous ne pouvez pas non plus modifier le débit approvisionné de l’index ou de la table. Vous ne pouvez pas ajouter ou supprimer d’autres index sur la table. En revanche, vous pouvez modifier le débit approvisionné de ces autres index.

**Remplissage**  
Pour chaque élément de la table, DynamoDB détermine l’ensemble d’attributs à écrire dans l’index en fonction de sa projection (`KEYS_ONLY`, `INCLUDE` ou `ALL`). Il écrit ensuite ces attributs dans l’index. Durant la phase de remplissage, DynamoDB suit les éléments ajoutés, supprimés ou mis à jour dans la table. Les attributs de ces éléments sont également ajoutés, supprimés ou mis à jour dans l’index, selon le cas.  
Au cours de la phase de remplissage, l’attribut `IndexStatus` est défini sur `CREATING`, et l’attribut `Backfilling` a la valeur true. Utilisez l’opération `DescribeTable` pour récupérer l’état d’une table et de tous ses index secondaires.  
Pendant le remplissage de l’index, vous ne pouvez pas supprimer sa table parent. Vous pouvez cependant toujours supprimer l’index ou modifier le débit approvisionné de la table et de n’importe lequel de ses index secondaires globaux.  
Pendant la phase de remplissage, certaines écritures d’éléments violant le schéma de clé peuvent aboutir tandis que d’autres sont rejetées. Après le remplissage, toutes les écritures dans les éléments, qui violent le schéma de clé du nouvel index sont rejetées. Nous vous recommandons d’exécuter l’outil de détection des violations une fois la phase de remplissage terminée afin de détecter et résoudre d’éventuelles violations de clé. Pour de plus amples informations, veuillez consulter [Détection et correction des violations de clé d’index dans DynamoDB](GSI.OnlineOps.ViolationDetection.md).

Pendant les phases d’allocation de ressources et de remplissage, l’index est dans l’état `CREATING`. Pendant ce temps, DynamoDB effectue des opérations de lecture sur la table. Vous n’êtes pas facturé pour les opérations de lecture de la table de base destinées au remplissage de l’index secondaire global.

Une fois la génération de l’index terminée, l’état passe à `ACTIVE`. Vous ne pouvez pas effectuer d’opération `Query` ou `Scan` sur l’index tant que l’état de celui-ci n’est pas `ACTIVE`.

**Note**  
Dans certains cas, DynamoDB ne peut pas écrire des données de la table dans l’index en raison de violations de clé d’index. Cela peut se produire si :  
Le type de données d’une valeur d’attribut ne correspond pas au type de données d’un type de données de schéma de clé d’index.
La taille d’un attribut dépasse la longueur maximale définie pour un attribut de clé d’index.
Un attribut de clé d’index a une valeur de String ou de Binary attribute vide.
Les violations de clé d’index n’interfèrent pas avec la création d’index secondaire global. Cependant, quand l’index passe à l’état `ACTIVE`, il ne contient plus de clé violant le schéma de clé.  
DynamoDB fournit un outil autonome pour détecter et résoudre ces problèmes. Pour de plus amples informations, veuillez consulter [Détection et correction des violations de clé d’index dans DynamoDB](GSI.OnlineOps.ViolationDetection.md).

### Ajout d’un index secondaire global à une table volumineuse
<a name="GSI.OnlineOps.Creating.LargeTable"></a>

Le temps nécessaire à la génération d’un index secondaire global dépend de plusieurs facteurs, tels que les suivants :
+ La taille de la table
+ Le nombre d’éléments dans la table pouvant être inclus dans l’index
+ Le nombre d’attributs projetés dans l’index
+ L’activité d’écriture sur la table principale pendant les générations d’index

Si vous ajoutez un index secondaire global à une table très volumineuse, le processus de création peut prendre beaucoup de temps. Pour suivre la progression et déterminer si la capacité d'écriture de l'index est suffisante, consultez les CloudWatch statistiques Amazon suivantes :
+ `OnlineIndexPercentageProgress`

Pour plus d'informations sur CloudWatch les métriques associées à DynamoDB, consultez. [Métriques DynamoDB](metrics-dimensions.md#dynamodb-metrics)

**Important**  
Vous devrez peut-être autoriser la mise en liste d’autorisation de très grandes tables avant de créer ou de mettre à jour un index secondaire global. Contactez le AWS Support pour autoriser la mise en liste de vos tables.

Pendant le remplissage d’un index, DynamoDB utilise la capacité système interne pour lire la table. Cela permet de minimiser l’impact de la création d’index et de s’assurer que la table ne manque pas de capacité de lecture.

## Suppression d’un index secondaire global
<a name="GSI.OnlineOps.Deleting"></a>

Si vous n’avez plus besoin d’un index secondaire global, vous pouvez le supprimer à l’aide de l’opération `UpdateTable`.

Vous ne pouvez supprimer qu’un seul index secondaire global par opération `UpdateTable`.

Le processus de suppression de l’index secondaire global n’a aucune incidence sur les activités de lecture ou d’écriture dans la table parent. Pendant la suppression, vous pouvez toujours modifier le débit approvisionné sur d’autres index.

**Note**  
Lorsque vous supprimez une table à l’aide de l’action `DeleteTable`, tous les index secondaires globaux sur cette table sont également supprimés.
Votre compte ne sera pas facturé pour l’opération de suppression de l’index secondaire global.

## Modification d’un index secondaire global pendant la création
<a name="GSI.OnlineOps.Creating.Modify"></a>

Pendant la génération d’un index, vous pouvez utiliser l’opération `DescribeTable` pour déterminer la phase en cours. La description de l’index inclut un attribut booléen, `Backfilling`, indiquant si DynamoDB est en train de charger l’index avec les éléments de la table. Si la valeur de `Backfilling` est true, la phase d’allocation de ressources est terminée et le remplissage de l’index est en cours. 

Pendant la phase de remplissage, vous pouvez supprimer l’index en cours de création. Au cours de cette phase, vous ne pouvez pas ajouter ou supprimer d’autres index sur la table.

**Note**  
Pour les index créés dans le cadre d’une opération `CreateTable`, l’attribut `Backfilling` n’apparaît pas dans la sortie `DescribeTable`. Pour de plus amples informations, veuillez consulter [Phases de création d'index](#GSI.OnlineOps.Creating.Phases).