View a markdown version of this page

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 del planificador de Amazon DocumentDB 8.0 admite 21 etapas de agregación, incluidas 6 etapas nuevas. Planner V3 incluye soporte incorporado para distintos comandos. Ofrece hasta el doble de mejora del rendimiento general con respecto a 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, $date y $date. ToParts FromParts

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 todos los países en los Regiones de AWS que está disponible la versión 8.0 del motor.

  • La versión 3.0 del planificador de consultas 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 cambió su planificador de consultas predeterminado en Amazon DocumentDB 8.0 y necesita volver al planificador v3, puede hacerlo desde la consola o 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 titulado «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. Ten 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 sean inconsistentes.

  • 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 puede aumentar la tasa de errores 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 consulta específico, Planner v3 no permite el uso de «PlanHint» y se basa en optimizaciones internas para elegir el mejor plan para una consulta determinada.

Mejoras en los operadores agregados y distintos

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

  • El planificador adelanta las etapas de $match siempre que es posible, lo que reduce la cantidad 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 en í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" } } } }

Planifique los filtros de caché

La versión 3.0 de Planner admite los filtros de caché del plan, también denominados filtros de índice, que permiten restringir el conjunto de índices que el planificador considera para una forma de consulta específica. Los filtros se configuran con un comando de base de datos y se aplican en el servidor, de modo que, si se produce una regresión en las consultas, puede mitigarla sin modificar el código de la aplicación.

La versión 3.0 de Planner aplica filtros de caché de planes a más comandos que la versión 2.0 de Planner:

  • El distinct comando requiere la versión 3.0 del planificador.

  • El aggregate comando requiere la versión 3.0 del planificador y la 8.0.2 de Amazon DocumentDB. Se aplica un filtro cuando la canalización lee la colección a través de una fase inicial. $match

  • Un filtro establecido en la colección extranjera de una $graphLookup etapa $lookup o etapa controla el índice utilizado para escanear esa colección extranjera. Esto también requiere la versión 3.0 del planificador y la 8.0.2 de Amazon DocumentDB.

Para obtener más información sobre la referencia de comandos, las formas de consulta compatibles, los ejemplos prácticos y la forma en que los filtros interactúan con las sugerencias, consulte. Planificar filtros de caché

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

En algunos casos extremos, es posible que la versión 3.0 del planificador produzca resultados que difieran ligeramente de 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 las etapas anteriores, como Match, filtran todos los documentos, Planner v1 muestra el «campo» de salida :0. Planner v3 y MongoDB no ofrecerán ningún resultado.

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

  • Cuando no existe una colección externa a la que se hace referencia en $lookup, plannerv1 emite 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 la versión 1 de Planner permitirá usar varias búsquedas de $ en un proceso. Planner v2/v3 generará 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 la versión 3 de Planner funciona cuando la etapa de 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])