Trois façons de tirer parti d’index composites dans Azure Cosmos DB

Publié le 19 septembre, 2019

Program Manager, Azure Cosmos DB

Les index composites ont été introduits dans Azure Cosmos DB dans le cadre de la conférence Microsoft Build 2019. Avec notre dernière mise à jour duc service, des types de requêtes supplémentaires peuvent désormais tirer parti d’index composites. Dans cet article, nous allons explorer les index composites et mettre en évidence les cas d’utilisation courants.

Types d’index dans Azure Cosmos DB

Azure Cosmos DB comporte actuellement les types d’index suivants utilisés pour les types de requêtes suivants :

Index de plage :

  • Requêtes d’égalité
  • Requêtes de plage
  • Requêtes ORDER BY sur une seule propriété
  • Requêtes JOIN

Index spatiaux :

  • Fonctions géospatiales

Index composites :

  • Requêtes ORDER BY sur plusieurs propriétés
  • Requêtes avec un filtre et une clause ORDER BY
  • Requêtes avec un filtre sur au moins deux propriétés

Cas d’utilisation d’index composite

Par défaut, Azure Cosmos DB crée un index de plage sur chaque propriété. Pour de nombreuses charges de travail, ces index suffisent et aucune optimisation n’est nécessaire. Des index composites peuvent être ajoutés en plus des index de plage par défaut. Les index composites ont à la fois un chemin d’accès et un ordre (ASC ou DESC) définis pour chaque propriété dans l’index composite.

Requêtes ORDER BY sur plusieurs propriétés

Si une requête a une clause ORDER BY avec au moins deux propriétés, un index composite est requis. Par exemple, la requête suivante nécessite un index composite défini sur l’âge et le nom (age ASC, name ASC) :

SELECT * FROM c ORDER BY c.age ASC, c.name ASC

Cette requête trie tous les résultats dans l’ordre croissant de la valeur de la propriété age. Si deux documents ont la même valeur d’âge, la requête trie les documents par nom.

Requêtes avec un filtre et une clause ORDER BY

Si une requête comporte un filtre ainsi qu’une clause ORDER BY sur différentes propriétés, un index composite améliore les performances. Par exemple, la requête suivante nécessite moins d’unités de requête (RU) si un index composite sur le nom et l’âge est défini et que la requête est mise à jour pour inclure le nom dans la clause ORDER BY :

Requête originale utilisant un index de plage :

SELECT * FROM c WHERE c.name = “Tim” ORDER BY c.age ASC

Requête révisée utilisant un index composite sur le nom et l’âge :

SELECT * FROM c WHERE c.name = “Tim” ORDER BY c.name ASC, c.age ASC

Bien qu’un index composite améliore sensiblement les performances des requêtes, vous pouvez toujours exécuter la requête d’origine avec succès sans index composite. Lorsque vous exécutez la requête révisée avec un index composite, les documents sont triés sur la propriété âge. Comme tous les documents correspondant au filtre ont la même valeur de nom, la requête les retourne par ordre croissant d’âge.

Requêtes avec un filtre sur plusieurs propriétés

Si une requête a un filtre avec au moins deux propriétés, l’ajout d’un index composite améliore les performances.

Considérez la requête suivante :

SELECT * FROM c WHERE c.name = “Tim” and c.age > 18

En l’absence d’index composite sur (nom ASC et âge ASC), nous utiliserons un index de plage pour cette requête. Nous pouvons améliorer l’efficacité de cette requête en créant un index composite pour le nom et l’âge.

Les requêtes avec plusieurs filtres d’égalité et au maximum un filtre de plage (tels que >, <, <=,>=,!=) Utilisent l’index composite. Dans certains cas, si une requête ne peut pas utiliser pleinement un index composite, elle utilise une combinaison des index composites définis et des index de plage. Pour plus d’informations, reportez-vous à notre documentation sur l’indexation.

Avantages de performance de l’indice composite

Nous pouvons exécuter quelques exemples de requêtes pour mettre en évidence les avantages de performance des index composites. Nous allons utiliser un jeu de données nutritionnel utilisé dans Azure Cosmos DB labs.

Dans cet exemple, nous allons optimiser une requête comportant un filtre ainsi qu’une clause ORDER BY. Nous allons commencer par la politique d’indexation par défaut qui indexe toutes les propriétés avec un index de plage. En exécutant la requête suivante comme indiqué dans l’image ci-dessous dans le portail Azure, nous observons les métriques de la requête :

Métriques de requête :

Requête utilisant un index de plage et consommant 21,8 RU.

Cette requête, avec la stratégie d’indexation par défaut, nécessitait 21,8 RU.

L’ajout d’un index composite sur foodGroup et _ts et la mise à jour du texte de la requête pour inclure foodGroup dans la clause ORDER BY ont considérablement réduit la charge de RU de la requête.

Métriques de requête :

Requête utilisant un index composite et consommant 4,07 RU.

Après l’ajout d’un index composite, la charge de RU de la requête a été ramenée de 21,8 à seulement 4,07 RU. Cette optimisation de la requête aura un impact particulier lorsque la taille totale des données augmentera. Les avantages d’un index composite sont significatifs lorsque les propriétés de la clause ORDER BY ont une cardinalité élevée.

Création d’index composites

Pour en apprendre davantage sur la création d’index composites, consultez cette documentation. Il est simple de mettre à jour la stratégie d’indexation directement via le portail Azure. Lors de la création d’un index composite pour des données déjà présentes dans Azure Cosmos DB, la mise à jour de l’index utilisera le reliquat de RU des opérations normales. Une fois la nouvelle stratégie d’indexation définie, Azure Cosmos DB indexe automatiquement les propriétés avec un index composite à mesure qu’elles sont écrite.

Déterminez si les index composites améliorent l’utilisation de RU pour vos charges de travail existantes sur Azure Cosmos DB.