Planificador de consultas v3 - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Planificador de consultas v3

La versión 3 de Planner de Amazon DocumentDB 8.0 admite 21 etapas de agregación, incluidas 6 etapas nuevas. Planner V3 incluye soporte integrado para distintos comandos. Ofrece una mejora del rendimiento general de hasta el doble en comparación con Planner v2 en Amazon DocumentDB 5.0. Todas las funciones y operadores nuevos de Amazon DocumentDB 8.0 son compatibles con Planner v3. Entre las nuevas etapas de agregación de Amazon DocumentDB 8.0 compatibles con Planner v3 se incluyen $replaceWith, $VectorSearch, $merge, $set, $unset y $bucket. Planner v3 también admite nuevas funciones y operadores en Amazon DocumentDB 8.0, como Collation, Views, $merge, $pow, $rand, $DateTrunc, $, $. dateToParts dateFromParts

Requisitos previos

Los siguientes requisitos previos se aplican a la versión 3.0 del planificador:

  • La versión 3.0 de Planner está disponible en todas las regiones en las que está disponible la versión 8.0 del motor.

  • La versión 3.0 de Planner es el planificador de consultas predeterminado cuando se selecciona la versión 8.0 del motor.

Seleccionar la versión 3.0 del planificador como planificador de consultas predeterminado

Si ha cambiado el planificador de consultas predeterminado en Amazon DocumentDB 8.0 y necesita volver al planificador v3, puede hacerlo desde la consola o desde la CLI:

  • Siga los pasos en Modificación de parámetros de clúster de Amazon DocumentDB para modificar el grupo de parámetros del clúster.

  • Para el parámetro denominado 'PlannerVersion', cambie el valor a 3.0 para indicar la versión 3.0 del planificador.

  • Seleccione Aplicar inmediatamente (si selecciona Aplicar al reiniciar, la selección no será válida hasta el siguiente reinicio del clúster).

Prácticas recomendadas

Para obtener los resultados esperados, utilice las siguientes prácticas recomendadas al aplicar la versión 3.0 del planificador:

  • En un clúster global, seleccione el mismo plannerVersion valor (1.0, 2.0 o 3.0) en los grupos de parámetros del clúster para ambas regiones. Tenga en cuenta que seleccionar diferentes versiones del planificador en las regiones principales y secundarias puede provocar que el comportamiento y el rendimiento de las consultas no sea constante.

  • La actualización a la versión 3.0 del planificador durante un período de mantenimiento programado o durante períodos de tráfico reducido será lo menos molesto, ya que las tasas de error pueden aumentar si se cambia la versión del planificador cuando las cargas de trabajo se están ejecutando activamente.

Limitaciones

Las siguientes limitaciones se aplican a la versión 3.0 del planificador:

  • La versión 3.0 de Planner no es compatible con los clústeres elásticos, que recurrirán a la versión 1.0 de Planner.

  • Si bien Planner v1 permite el uso de «PlanHint» para garantizar que el optimizador de consultas seleccione un plan de consultas específico, Planner v3 no permite el uso de «PlanHint» y se basa en optimizaciones internas para elegir el mejor plan para la consulta en cuestión.

Mejoras en operadores aggregate y distinct

La versión 3.0 de Planner introduce mejoras en las etapas de $aggregate y en el comando $distinct. Las siguientes son algunas de las mejoras más destacables.

  • Cuando es posible, el planificador sitúa las etapas de $match en una fase más temprana del proceso, lo que reduce el número de documentos procesados en las etapas posteriores.

    //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 } } ])
  • El planificador combina automáticamente las etapas $lookup y $unwind cuando funcionan en el mismo campo, lo que reduce el procesamiento intermedio de datos y mejora el rendimiento.

    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 versión 3.0 de Planner presenta una nueva estrategia de ejecución de Distinct Scan que mejora significativamente el rendimiento de distintas operaciones con índices de cardinalidad bajos.

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

Posibles diferencias de comportamiento entre las versiones 1.0, 3.0 y MongoDB del planificador

En algunos casos extremos, es posible que la versión 3.0 del planificador produzca resultados ligeramente diferentes a los de la versión 1.0 del planificador. En esta sección se describen algunos ejemplos de estas posibilidades.

Feature Differences
  • En una colección vacía o cuando etapas anteriores, como una coincidencia, filtran todos los documentos, Planner v1 muestra el «campo» de salida :0. Planner v3 y MongoDB no darán ningún resultado.

  • Con Plannerv1, {"$skip» :n} no omite si la etapa anterior devolvió menos de n documentos. Plannerv3 y MongoDB omiten correctamente independientemente del número de documentos devueltos.

  • Cuando no existe una colección externa a la que se hace referencia en $lookup, plannerv1 arroja un error. Planner v3 y MongoDB tratan la colección externa como una colección vacía y ejecutan $lookup.

    db.coll.aggregate([ {$lookup: {from: "does_not_exist", localField: "a", foreignField: "a", as: "c"}} ])
  • Solo Planner v1 permitirá usar múltiples $search en una canalización. Planner v2/v3 arrojará un error y MongoDB no lo admite.

    VectorSearch = { "$search": { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "cosine", "k": 2, "efSearch": 1 }}} db.coll.aggregate([VectorSearch, VectorSearch])
  • Solo Planner v3 funciona cuando la etapa VectorSearch no es la primera etapa. En este caso, MongoDB generará un error y Planner v1 no admite la etapa $VectorSearch.

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