Abfrageplaner v3 - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Abfrageplaner v3

Planner Version 3 in Amazon DocumentDB 8.0 unterstützt 21 Aggregationsphasen, darunter 6 neue Phasen. Planner V3 bietet integrierte Unterstützung für unterschiedliche Befehle. Es bietet eine bis zu 2-fache Gesamtleistungsverbesserung gegenüber Planner v2 in Amazon DocumentDB 5.0. Alle neuen Funktionen und Operatoren in Amazon DocumentDB 8.0 sind mit Planner v3 kompatibel. Zu den neuen Aggregationsstufen in Amazon DocumentDB 8.0, die von Planner v3 unterstützt werden, gehören $replaceWith, $vectorSearch, $merge, $set, $unset, $bucket. Planner v3 unterstützt auch neue Funktionen und Operatoren in Amazon DocumentDB 8.0, darunter Collation, Views, $merge, $pow, $rand, $DateTrunc, $, $. dateToParts dateFromParts

Voraussetzungen

Die folgenden Voraussetzungen gelten für Planner Version 3.0:

  • Planner Version 3.0 ist in allen Regionen verfügbar, in denen Engine-Version 8.0 verfügbar ist.

  • Planner Version 3.0 ist der Standard-Abfrageplaner, wenn Engine-Version 8.0 ausgewählt ist.

Auswahl der Planner-Version 3.0 als Standard-Abfrageplaner

Wenn Sie Ihren Standard-Abfrageplaner in Amazon DocumentDB 8.0 geändert haben und zu Planner v3 zurückkehren müssen, können Sie dies über die Konsole oder CLI tun:

  • Folgen Sie den Schritten unterAmazon DocumentDB-Cluster-Parameter ändern, um die Parametergruppe Ihres Clusters zu ändern.

  • Ändern Sie für den Parameter mit dem Titel 'PlannerVersion' den Wert auf 3.0, was Planner-Version 3.0 bedeutet.

  • Wählen Sie Sofort anwenden (wenn Sie Beim Neustart anwenden auswählen, wird die Auswahl bis zum nächsten Neustart des Clusters unwirksam).

Best Practices

Verwenden Sie die folgenden bewährten Methoden, um die erwarteten Ergebnisse zu erzielen, wenn Sie Planner Version 3.0 anwenden:

  • Wählen Sie in einem globalen Cluster denselben plannerVersion Wert (1,0 oder 2,0 oder 3,0) in den Cluster-Parametergruppen für beide Regionen aus. Beachten Sie, dass die Auswahl verschiedener Planner-Versionen in primären und sekundären Regionen zu inkonsistentem Abfrageverhalten und inkonsistenter Leistung führen kann.

  • Die Aktualisierung auf Planner Version 3.0 während eines geplanten Wartungsfensters oder in Zeiten mit reduziertem Datenverkehr ist am wenigsten störend, da es zu erhöhten Fehlerraten kommen kann, wenn die Planner-Version geändert wird, während Workloads aktiv ausgeführt werden.

Einschränkungen

Die folgenden Einschränkungen gelten für Planner Version 3.0:

  • Planner Version 3.0 wird in Elastic Clustern nicht unterstützt, da hier auf Planner Version 1.0 zurückgegriffen wird.

  • Planner v1 ermöglicht zwar die Verwendung von 'PlanHint', um sicherzustellen, dass ein bestimmter Abfrageplan vom Abfrageoptimierer ausgewählt wird, Planner v3 erlaubt jedoch nicht die Verwendung von 'PlanHint' und stützt sich auf interne Optimierungen, um den besten Plan für die jeweilige Abfrage auszuwählen.

Verbesserungen an und Operatoren aggregatedistinct

Planner Version 3.0 bietet Verbesserungen in den Stufen $aggregate und $distinct. Im Folgenden sind einige der bemerkenswertesten Verbesserungen aufgeführt..

  • Der Planer verschiebt die $match-Phasen nach Möglichkeit früher in der Pipeline und reduziert so die Anzahl der Dokumente, die in nachfolgenden Phasen verarbeitet werden.

    //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 } } ])
  • Der Planer kombiniert automatisch die Phasen $lookup und $unwind, wenn sie sich auf dasselbe Feld beziehen. Dadurch wird die zwischenzeitliche Datenverarbeitung reduziert und die Leistung verbessert.

    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
  • Planner Version 3.0 führt eine neue Ausführungsstrategie für Distinct Scan ein, die die Leistung bestimmter Operationen mit Indizes mit niedriger Kardinalität erheblich verbessert.

    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" } } } }

Mögliche Verhaltensunterschiede zwischen Planner Version 1.0, 3.0 und MongoDB

In einigen Ausnahmefällen ist es möglich, dass Planner Version 3.0 zu Ergebnissen führt, die leicht von Planner Version 1.0 abweichen. In diesem Abschnitt werden einige Beispiele für diese Möglichkeiten beschrieben.

Feature Differences
  • Bei einer leeren Sammlung oder wenn vorherige Schritte wie Match alle Dokumente gefiltert haben, gibt Planner v1 die Ausgabe „field“ :0 zurück. Planner v3 und MongoDB geben keine Ausgaben aus.

  • Bei Plannerv1 überspringt {"$skip“ :n} nicht, wenn in der vorherigen Phase weniger als n Dokumente zurückgegeben wurden. Plannerv3 und MongoDB überspringen unabhängig von der Anzahl der zurückgegebenen Dokumente korrekt.

  • Wenn eine fremde Sammlung, auf die in $lookup verwiesen wird, nicht existiert, gibt Plannerv1 einen Fehler aus. Planner v3 und MongoDB behandeln die fremde Sammlung als leere Sammlung und führen $lookup durch.

    db.coll.aggregate([ {$lookup: {from: "does_not_exist", localField: "a", foreignField: "a", as: "c"}} ])
  • Nur Planner v1 erlaubt die Verwendung mehrerer $search in einer Pipeline. Planner v2/v3 gibt einen Fehler aus und MongoDB unterstützt ihn nicht.

    VectorSearch = { "$search": { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "cosine", "k": 2, "efSearch": 1 }}} db.coll.aggregate([VectorSearch, VectorSearch])
  • Nur Planner v3 funktioniert, wenn die VectorSearch-Phase nicht die erste Phase ist. In diesem Fall gibt MongoDB einen Fehler aus und Planner v1 unterstützt die $vectorSearch-Stufe nicht.

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