Optimiser les performances des requêtes
Pour résoudre les problèmes de lenteur des requêtes, utilisez Expliquer la requête pour obtenir le plan d'exécution de la requête et le profil d'exécution du runtime. La section suivante décrit les étapes à suivre pour optimiser les performances des requêtes en fonction du profil d'exécution :Limiter le nombre de résultats
Utilisez le champ "Enregistrements renvoyés" dans l'arborescence d'exécution pour déterminer si la requête renvoie de nombreux documents. Envisagez de limiter le nombre de documents renvoyés à l'aide de la clause $limit
. Cela réduit la taille en octets sérialisés des résultats lorsqu'ils sont renvoyés aux clients sur le réseau. Dans les cas où le nœud Limit
est précédé d'un nœud MajorSort
, le moteur de requête peut fusionner les nœuds Limit
et MajorSort
, et remplacer une matérialisation et un tri complets en mémoire par un tri TopN, ce qui réduit la quantité de mémoire requise pour la requête.
Limiter la taille du document de résultat
Envisagez de limiter la taille du document renvoyé à l'aide de la clause $project
pour éviter de récupérer des champs inutiles. Cela permet de réduire les coûts de calcul et de mémoire liés au traitement des résultats intermédiaires, ainsi que la taille en octets sérialisés des résultats lorsqu'ils sont renvoyés aux clients sur le réseau. Dans les cas où tous les champs référencés dans la requête sont couverts par un index régulier (et non multiclés), cela permet également à la requête d'être entièrement couverte par l'analyse de l'index, ce qui évite d'avoir à extraire les documents du stockage principal.
Utiliser des index
Suivez les instructions ci-dessous pour configurer et optimiser les index.
Déterminer si la requête utilise un index
Pour savoir si la requête utilise un index, vérifiez les nœuds feuilles dans l'arborescence d'exécution. Si le nœud feuille de l'arborescence d'exécution est un nœud TableScan, cela signifie que la requête n'utilise pas d'index et qu'elle analyse les documents du stockage principal. Si un index est utilisé, le nœud feuille de l'arborescence d'exécution affiche l'ID et les champs de l'index.
Identifier si l'index utilisé peut être optimisé
Un index est utile pour une requête s'il peut réduire le nombre de documents que le moteur de requête doit extraire du stockage principal ou si l'ordre de ses champs peut répondre aux exigences de tri de la requête.
Si un index est utilisé pour une requête, mais que le moteur de requête récupère et supprime toujours de nombreux documents (comme l'indique un nœud "Scan" qui renvoie de nombreux enregistrements, suivi d'un nœud "Filter" qui renvoie peu d'enregistrements), cela signifie que le prédicat de requête satisfait à l'aide de l'index n'est pas sélectif. Pour créer un index plus adapté, consultez Créer des index.
Si un index non multiclés est utilisé pour une requête, mais que le moteur de requête effectue toujours un réordonnancement en mémoire de l'ensemble de résultats, comme l'indique un nœud MajorSort dans l'arborescence d'exécution de la requête, cela signifie que l'index utilisé ne peut pas être utilisé pour répondre à l'exigence de tri de la requête. Pour créer un index plus adapté, consultez la section suivante.
Créer des index
Suivez la documentation sur la gestion des index pour créer des index. Pour vous assurer que votre requête peut utiliser des index, créez des index standards (et non multiclés) avec des champs dans l'ordre suivant :
- Tous les champs qui seront utilisés dans les opérateurs d'égalité. Pour maximiser les chances de réutilisation entre les requêtes, ordonnez les champs par ordre décroissant de leur fréquence dans les opérateurs d'égalité entre les requêtes.
- Tous les champs sur lesquels le tri sera effectué (dans le même ordre).
- Champs qui seront utilisés dans les opérateurs d'intervalle ou d'inégalité par ordre décroissant de sélectivité des contraintes de requête.
- Champs qui seront renvoyés dans le cadre d'une requête dans l'index : l'inclusion de ces champs dans l'index permet à l'index de couvrir la requête et d'éviter d'avoir à récupérer le document à partir du stockage principal.
Pour les requêtes qui impliquent le filtrage et le tri des champs de tableau, envisagez de créer des index multiclés.
Utiliser un indice de requête
Si vous avez créé un index plus adapté à la requête, mais que le moteur de requêtes ne l'utilise pas, vous pouvez remplacer la préférence d'index du moteur de requêtes à l'aide d'un indicateur de requête.