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 du planificateur d'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 une amélioration globale des performances allant jusqu'à 2 fois par rapport à Planner v2 dans Amazon DocumentDB 5.0. Toutes les nouvelles fonctionnalités et 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, $unset, $bucket. Planner v3 prend également en charge les nouvelles fonctionnalités et les nouveaux opérateurs d'Amazon DocumentDB 8.0, notamment Collation, Views, $merge, $pow, $rand, $dateTrunc, $, $. dateToParts dateFromParts

Conditions préalables

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

  • La version 3.0 de Planner est disponible dans toutes les régions où la version 8.0 du moteur est disponible.

  • La version 3.0 du planificateur 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 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 la CLI :

  • 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 pour indiquer la version 3.0 du planificateur.

  • Sélectionnez Appliquer immédiatement (sélectionner Appliquer au redémarrage rendra la sélection inefficace jusqu'au prochain redémarrage du cluster).

Bonnes pratiques

Pour obtenir les résultats escomptés, appliquez les meilleures 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, 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 principale et secondaire peut entraîner un comportement et des performances de requête incohérents.

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

Limitations

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

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

  • Alors que Planner v1 autorise l'utilisation de « PlanHint » pour garantir 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 distinct opérateurs aggregate et aux opérateurs

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 fonctionnent sur le même terrain, ce qui réduit le traitement intermédiaire des données et améliore 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 de Distinct Scan qui améliore considérablement les performances des opérations distinctes sur des indices 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" } } } }

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

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 donneront aucune sortie.

  • Avec Plannerv1, {"$skip » :n} n'est pas ignoré si moins de n documents ont été renvoyés à 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 génère 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 le Planner v1 permettra d'utiliser plusieurs $search dans un pipeline. Planner v2/v3 générera une erreur et MongoDB ne le supporte pas.

    VectorSearch = { "$search": { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "cosine", "k": 2, "efSearch": 1 }}} db.coll.aggregate([VectorSearch, VectorSearch])
  • Seul le 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])