View a markdown version of this page

Planificateur de requêtes v3 - Amazon DocumentDB

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.

Planificateur de requêtes v3

La version 3 de Planner dans Amazon DocumentDB 8.0 prend en charge 21 étapes d'agrégation, dont 6 nouvelles étapes. Planner V3 est livré avec un support intégré pour des commandes distinctes. Il offre des performances globales jusqu'à 2 fois supérieures à celles de Planner v2 dans Amazon DocumentDB 5.0. Toutes les nouvelles fonctionnalités et tous les nouveaux opérateurs d'Amazon DocumentDB 8.0 sont compatibles avec Planner v3. Les nouvelles étapes d'agrégation d'Amazon DocumentDB 8.0 prises en charge par Planner v3 incluent $replaceWith, $VectorSearch, $merge, $set, $unset, $bucket. Planner v3 prend également en charge de nouvelles fonctionnalités et de nouveaux opérateurs dans Amazon DocumentDB 8.0, notamment Collation, Views, $merge, $pow, $rand, $dateTrunc, $date, $date. ToParts FromParts

Conditions préalables

Les prérequis suivants s'appliquent à la version 3.0 du planificateur :

  • La version 3.0 de Planner est disponible dans tous les Régions AWS pays où la version 8.0 du moteur est disponible.

  • La version 3.0 de Planner est le planificateur de requêtes par défaut lorsque la version 8.0 du moteur est sélectionnée.

Sélection de la version 3.0 du planificateur de requêtes comme planificateur de requêtes par défaut

Si vous avez modifié votre planificateur de requêtes par défaut dans Amazon DocumentDB 8.0 et que vous devez revenir au planificateur v3, vous pouvez le faire depuis la console ou l'interface de ligne de commande :

  • Suivez les étapes décrites Modification des paramètres du cluster Amazon DocumentDB pour modifier le groupe de paramètres de votre cluster.

  • Pour le paramètre intitulé « PlannerVersion », remplacez la valeur par 3.0, indiquant la version 3.0 du planificateur.

  • Sélectionnez Appliquer immédiatement (si vous sélectionnez Appliquer au redémarrage, la sélection sera inefficace jusqu'au prochain redémarrage du cluster).

Bonnes pratiques

Pour obtenir les résultats escomptés, appliquez les bonnes pratiques suivantes lors de l'application de la version 3.0 du planificateur :

  • Dans un cluster global, sélectionnez la même plannerVersion valeur (1.0 ou 2.0 ou 3.0) dans les groupes de paramètres du cluster pour les deux régions. Notez que la sélection de différentes versions du planificateur dans les régions principales et secondaires peut entraîner un comportement et des performances incohérents des requêtes.

  • La mise à jour vers la version 3.0 du planificateur pendant une fenêtre de maintenance planifiée ou pendant des périodes de trafic réduit sera la solution la moins perturbatrice, car les taux d'erreur peuvent augmenter si la version du planificateur est modifiée alors que les charges de travail sont en cours d'exécution active.

Limitations

Les limites suivantes s'appliquent à la version 3.0 du planificateur :

  • La version 3.0 de Planner n'est pas prise en charge dans les clusters élastiques, qui reviendront à la version 1.0 de Planner.

  • Alors que Planner v1 permet d'utiliser « PlanHint » pour s'assurer qu'un plan de requête spécifique est sélectionné par l'optimiseur de requêtes, Planner v3 n'autorise pas l'utilisation de « PlanHint » et s'appuie sur des optimisations internes pour choisir le meilleur plan pour la requête donnée.

Améliorations apportées aux opérateurs agrégés et distincts

La version 3.0 de Planner introduit des améliorations concernant les étapes $aggregate et la commande $distinct. Voici quelques-unes des améliorations les plus remarquables.

  • Le planificateur déplace les étapes $match plus tôt dans le pipeline lorsque cela est possible, réduisant ainsi le nombre de documents traités par les étapes suivantes.

    //Planner v1 db.orders.aggregate([ { $project: { customerId: 1, orderDate: 1, totalAmount: 1 } }, { $match: { customerId: { $gt: 1000 } } } ]) // Planner v3 pulls up the match since customerId exists in original documents // Optimized internally as: db.orders.aggregate([ { $match: { customerId: { $gt: 1000 } } }, // Pulled up before project { $project: { customerId: 1, orderDate: 1, totalAmount: 1 } } ])
  • Le planificateur combine automatiquement les étapes $lookup et $unwind lorsqu'elles opèrent sur le même terrain, réduisant ainsi le traitement des données intermédiaires et améliorant les performances.

    Example query: //Planner v1 db.orders.aggregate([ { $lookup: { from: "products", localField: "productId", foreignField: "_id", as: "productInfo" } }, { $unwind: "$productInfo" }, { $project: { orderDate: 1, "productInfo.name": 1, "productInfo.price": 1 } } ]) // Planner version 3.0 optimizes this internally by coalescing the $lookup and $unwind stages
  • La version 3.0 de Planner introduit une nouvelle stratégie d'exécution du scan distinct qui améliore considérablement les performances des opérations distinctes sur des index de cardinalité faibles.

    Example query: //// If there is a low cardinality index on "category", you may see a query plan like below db.explain().products.distinct("category") "queryPlanner" : { "plannerVersion" : 3, "namespace" : "db.products", "winningPlan" : { "stage" : "AGGREGATE", "inputStage" : { "stage" : "DISTINCT_SCAN", "inputStage" : { "stage" : "IXONLYSCAN", "indexName" : "category_1", "direction" : "forward" } } } }

Planifier les filtres de cache

La version 3.0 de Planner prend en charge les filtres de cache de plan, également appelés filtres d'index, qui vous permettent de restreindre l'ensemble d'index pris en compte par le planificateur pour une forme de requête spécifique. Les filtres sont définis à l'aide d'une commande de base de données et appliqués sur le serveur. Ainsi, si vous rencontrez une régression de requête, vous pouvez l'atténuer sans modifier le code de votre application.

La version 3.0 de Planner applique des filtres de cache de plan à un plus grand nombre de commandes que ne le fait la version 2.0 de Planner :

  • La distinct commande nécessite la version 3.0 du planificateur.

  • La aggregate commande nécessite la version 3.0 du planificateur et Amazon DocumentDB 8.0.2. Un filtre s'applique lorsque le pipeline lit la collection tout au long d'une $match étape principale.

  • Un filtre défini sur la collection étrangère d'un $graphLookup étage $lookup ou détermine l'index utilisé pour scanner cette collection étrangère. Cela nécessite également la version 3.0 du planificateur et Amazon DocumentDB 8.0.2.

Pour plus d'informations sur la référence des commandes, les formes de requête prises en charge, des exemples pratiques et la manière dont les filtres interagissent avec les astuces, consultezPlanifier les filtres de cache.

Différences de comportement potentielles entre les versions 1.0 et 3.0 du planificateur et MongoDB

Dans certains cas extrêmes, il est possible que la version 3.0 du planificateur produise des résultats légèrement différents de ceux de la version 1.0 du planificateur. Cette section présente quelques exemples de ces possibilités.

Feature Differences
  • Sur une collection vide ou lorsque les étapes précédentes, comme Match, filtrent tous les documents, Planner v1 donne le « champ » de sortie :0. Planner v3 et MongoDB ne fourniront aucune sortie.

  • Avec Plannerv1, {"$skip » :n} n'est pas ignoré s'il y a moins de n documents renvoyés lors de l'étape précédente. Plannerv3 et MongoDB ignorent correctement quel que soit le nombre de documents renvoyés.

  • Lorsqu'une collection étrangère référencée dans $lookup n'existe pas, plannerv1 renvoie une erreur. Planner v3 et MongoDB traitent la collection étrangère comme une collection vide et exécutent $lookup.

    db.coll.aggregate([ {$lookup: {from: "does_not_exist", localField: "a", foreignField: "a", as: "c"}} ])
  • Seul Planner v1 permettra d'utiliser plusieurs $search dans un pipeline. Le planificateur v2/v3 générera une erreur et MongoDB ne le prend pas en charge.

    VectorSearch = { "$search": { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "cosine", "k": 2, "efSearch": 1 }}} db.coll.aggregate([VectorSearch, VectorSearch])
  • Seul Planner v3 fonctionne lorsque l'étape VectorSearch n'est pas la première étape. Dans ce cas, MongoDB générera une erreur et Planner v1 ne prend pas en charge le stage $VectorSearch.

    VectorSearch = { {"$vectorSearch": { "queryVector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "limit": 4, "numCandidates": 100} } db.coll.aggregate([$match:{}, VectorSearch])