Docs Menu
Docs Home
/ /

Explique los resultados

Para devolver información sobre Planes de consulta y estadísticas de ejecución de los planes de consulta, MongoDB proporciona los siguientes métodos:

Para aprender sobre los campos importantes de resultados de explain y cómo interpretarlos, se puede consultar Interpretar los resultados del plan de explicación.

Importante

explain ignora la caché del plan. En su lugar, se genera un conjunto de planes candidatos y se elige un ganador sin consultar la caché del plan. Además, explain impide que el planificador de query de MongoDB almacene en caché el plan ganador.

Nota

En esta página solo se muestran los campos de salida más importantes, y los campos para uso interno no están documentados. Los campos enumerados en el resultado están sujetos a cambios.

Los resultados explain presentan los planes del query como un árbol de etapas. La estructura de salida puede diferir según el motor del query que utiliza la operación. Las operaciones pueden usar el motor del query clásico o el motor del query basado en ranuras.

Nota

A partir de la versión 7.0.17, el motor de ejecución de consultas basado en ranuras ya no está habilitado de forma predeterminada en las versiones de parche de 7.0. Si desea que sus consultas utilicen el motor de ejecución de consultas basado en ranuras, actualice a la versión 8.0, donde está habilitado de forma predeterminada.

Para ver cómo la estructura de salida puede diferir entre los dos motores de ejecución, consulte los siguientes ejemplos:

winningPlan: {
stage: <STAGE1>,
...
inputStage: {
stage: <STAGE2>,
...
inputStage: {
stage: <STAGE3>,
...
}
}
},
winningPlan: {
queryPlan: {
stage: <STAGE1>,
...
inputStage: {
stage: <STAGE2>,
...
inputStage: {
stage: <STAGE3>,
...
}
}
}
slotBasedPlan: {
...
}
},

Cada etapa pasa sus documentos resultantes o claves de índice al nodo principal. Los nodos hoja acceden a la colección o a los índices. Los nodos internos utilizan los documentos o las claves de índice que resultan de los nodos secundarios. El nodo raíz indica la etapa de la que MongoDB finalmente deriva el conjunto de resultados.

Las etapas son descriptivas de la operación. Por ejemplo:

  • COLLSCAN para un escaneo de colección

  • IXSCAN para el escaneo de claves de índice

  • FETCH para la recuperación de documentos

  • GROUP para la agrupación de documentos

  • SHARD_MERGE para combinar resultados de fragmentos

  • SHARDING_FILTER para el filtrado de documentos huérfanos de los fragmentos

  • BATCHED_DELETE para el borrado de múltiples documentos que se agrupan internamente (a partir de MongoDB 6.1)

Esta sección muestra la salida explain para MongoDB 5.1 y versiones posteriores. Para ver el resultado de la explicación de versiones anteriores de MongoDB, se puede consultar la documentación de esa versión.

explain.explainVersion

Campo de enteros.

explainVersion es la versión del formato de salida para el plan, como "1" o "2".

Nuevo en la versión 5.1.

La información de explain.queryPlanner detalla el plan seleccionado por el optimizador del query.

Estos ejemplos pueden combinar las estructuras de salida de los motores de ejecución clásicos y basados en ranuras de MongoDB. No están destinados a ser representativos. La salida puede diferir significativamente.

Para colecciones no particionadas, explain devuelve la siguiente información queryPlanner:

queryPlanner: {
namespace: <string>,
indexFilterSet: <boolean>,
parsedQuery: {
...
},
queryHash: <hexadecimal string>,
planCacheKey: <hexadecimal string>,
maxIndexedOrSolutionsReached: <boolean>,
maxIndexedAndSolutionsReached: <boolean>,
maxScansToExplodeReached: <boolean>,
winningPlan: {
stage: <STAGE1>,
inputStage: {
stage: <string>,
...
}
},
rejectedPlans: [
<candidate plan1>,
]
}

Para las colecciones particionadas, explain incluye el planificador de queries principal y la información del servidor para cada partición a la que se accede en el campo shards:

{
queryPlanner: {
mongosPlannerVersion: <int>
winningPlan: {
stage: <STAGE1>,
shards: [
{
shardName: <string>,
connectionString: <string>,
serverInfo: {
...
},
namespace: <string>,
indexFilterSet: <boolean>,
parsedQuery: {
...
},
queryHash: <hexadecimal string>,
planCacheKey: <hexadecimal string>,
maxIndexedOrSolutionsReached: <boolean>,
maxIndexedAndSolutionsReached: <boolean>,
maxScansToExplodeReached: <boolean>,
winningPlan: {
stage: <STAGE1>,
inputStage: {
stage: <string>,
...
}
},
rejectedPlans: [
<candidate plan1>,
]
}
]
}
}
}
explain.queryPlanner

Contiene información sobre la selección del plan del query por parte del optimizador del query.

explain.queryPlanner.namespace

Una string que especifica el namespace con los nombres de la base de datos y la colección a los que accede la query. El namespace tiene el formato <database>.<collection>.

explain.queryPlanner.indexFilterSet

Un valor booleano que especifica si MongoDB aplicó un filtro de índice para la forma de la consulta.

explain.queryPlanner.queryHash

Una cadena hexadecimal que representa el hash de la forma de consulta y depende únicamente de las formas de consulta. queryHash puede ayudar a identificar consultas lentas (incluido el filtro de consulta de operaciones de escritura) con la misma forma de consulta.

Nota

Como con cualquier función encriptada, dos formas del query diferentes pueden dar como resultado el mismo valor encriptado. Sin embargo, es poco probable que ocurran colisiones encriptadas entre diferentes formas del query.

Para obtener más información sobre queryHash y,planCacheKey consulte queryHash y.planCacheKey

explain.queryPlanner.planCacheKey

Un hash de la clave para la entrada de caché del plan asociada con el query.

A diferencia explain.queryPlanner.queryHash de, depende tanto de la forma de la consulta como de los índices disponibles para ella. Es decir, si se añaden o eliminan índices compatibles con la forma de la consulta,explain.queryPlanner.planCacheKey el planCacheKey valor de podría cambiar, mientras que el queryHash de no cambiaría.

Para obtener más información sobre queryHash y,planCacheKey consulte queryHash y.planCacheKey

explain.queryPlanner.optimizationTimeMillis

Tiempo en milisegundos que el planificador del query dedicó a la optimización del query. Este resultado no incluye el tiempo dedicado a optimizar las queries internas $lookup.

explain.queryPlanner.optimizedPipeline

Un valor booleano que indica que toda la operación del pipeline de agregación se ha optimizado y, en su lugar, se ha completado mediante un árbol de etapas de ejecución del plan de queries.

Por ejemplo, la siguiente operación de agregación puede cumplirse mediante el árbol de ejecución del plan del query en lugar de usar el pipeline de agregación.

db.example.aggregate([ { $match: { someFlag: true } } ] )

El campo solo está presente si el valor es true y solo se aplica para explicar en las operaciones del pipeline de agregación. Cuando true, dado que el pipeline fue optimizado, no aparece información sobre la etapa de agregación en la salida.

explain.queryPlanner.winningPlan

Un documento que detalla el plan seleccionado por el optimizador del query.

explain.queryPlanner.winningPlan.stage

Una string que indica el nombre de la etapa.

Cada etapa consta de información específica de la etapa. Por ejemplo, una etapa IXSCAN incluye los límites del índice junto con otros datos específicos de la exploración del índice. Si una etapa tiene una etapa secundaria o varias etapas secundarias, la etapa tendrá un inputStage o inputStages.

Este campo aparece si la operación utilizó el motor de ejecución de query clásico.

explain.queryPlanner.winningPlan.inputStage

Un documento que describe la etapa secundaria, que proporciona los documentos o claves de índice a su etapa principal. El campo está presente si la etapa principal tiene solo una secundaria.

explain.queryPlanner.winningPlan.inputStages

Un arreglo de documentos que describen las etapas secundarias. Las etapas secundarias proporcionan los documentos o las claves de índice a la etapa principal. El campo está presente si la etapa principal tiene múltiples nodos secundarios. Por ejemplo, las etapas para expresiones $or podrían consumir entradas de múltiples fuentes.

Este campo aparece si la operación utilizó el motor de ejecución de query clásico.

explain.queryPlanner.winningPlan.queryPlan

Un documento que detalla el plan seleccionado por el optimizador del query. MongoDB presenta el plan como un árbol de etapas.

Este documento aparece si el query utilizó el motor de ejecución de queries basado en slots.

Nuevo en la versión 5.1.

explain.queryPlanner.winningPlan.queryPlan.stage

Una string que indica el nombre de la etapa.

Cada etapa consta de información específica para esa etapa. Por ejemplo, una etapa IXSCAN incluye los límites del índice junto con otros datos específicos de la exploración del índice.

explain.queryPlanner.winningPlan.queryPlan.planNodeId

Campo entero único que identifica cada etapa en el plan de ejecución. El campo se incluye en todas las etapas a lo largo de los resultados del explain.

Nuevo en la versión 5.1.

explain.queryPlanner.winningPlan.queryPlan.inputStage

Se puede consultar explain.queryPlanner.winningPlan.inputStage.

explain.queryPlanner.winningPlan.slotBasedPlan

Documento con información sobre el árbol y las etapas del plan de ejecución de consultas basadas en ranuras. Para uso interno de MongoDB.

Nuevo en la versión 5.1.

explain.queryPlanner.rejectedPlans

Arreglo de planes candidatos considerados y rechazados por el optimizador del query. El arreglo puede estar vacío si no hay otros planes candidatos.

La información devuelta explain.executionStats detalla la ejecución del plan ganador. Para incluir executionStats en los resultados, se debe ejecutar la explicación en:

Estos ejemplos pueden combinar las estructuras de salida de los motores de ejecución clásicos y basados en ranuras de MongoDB. No están destinados a ser representativos. La salida puede diferir significativamente.

Para colecciones no particionadas, explain devuelve la siguiente información executionStats:

executionStats: {
executionSuccess: <boolean>,
nReturned: <int>,
executionTimeMillis: <int>,
totalKeysExamined: <int>,
totalDocsExamined: <int>,
executionStages: {
stage: <STAGE1>
nReturned: <int>,
executionTimeMillisEstimate: <int>,
opens: <int>, // Starting in MongoDB 5.1
closes: <int>, // Starting in MongoDB 5.1
works: <int>,
advanced: <int>,
needTime: <int>,
needYield: <int>,
saveState: <int>,
restoreState: <int>,
isEOF: <boolean>,
...
inputStage: {
stage: <STAGE2>,
nReturned: <int>,
...
numReads: <int>, // Starting in MongoDB 5.1
...
executionTimeMillisEstimate: <int>,
...
inputStage: {
...
}
}
},
allPlansExecution: [
{
nReturned: <int>,
executionTimeMillisEstimate: <int>,
totalKeysExamined: <int>,
totalDocsExamined: <int>,
score: <double>,
executionStages: {
stage: <STAGEA>,
nReturned: <int>,
executionTimeMillisEstimate: <int>,
...
inputStage: {
stage: <STAGEB>,
...
inputStage: {
...
}
}
}
},
...
]
operationMetrics: {
cpuNanos: <int>,
cursorSeeks: <int>,
docBytesRead: <int>,
docBytesWritten: <int>,
docUnitsRead: <int>,
docUnitsReturned: <int>,
docUnitsWritten: <int>,
idxEntryBytesRead: <int>,
idxEntryBytesWritten: <int>,
idxEntryUnitsRead: <int>,
idxEntryUnitsWritten: <int>,
totalUnitsWritten: <int>,
keysSorted: <int>,
sorterSpills: <int>
}
}

Para colecciones particionadas, explain incluye las estadísticas de ejecución de cada partición accedida.

executionStats: {
nReturned: <int>,
executionTimeMillis: <int>,
totalKeysExamined: <int>,
totalDocsExamined: <int>,
executionStages: {
stage: <STAGE1>
nReturned: <int>,
executionTimeMillis: <int>,
opens: <int>, // Starting in MongoDB 5.1
closes: <int>, // Starting in MongoDB 5.1
totalKeysExamined: <int>,
totalDocsExamined: <int>,
totalChildMillis: <NumberLong>,
shards: [
{
shardName: <string>,
executionSuccess: <boolean>,
executionStages: {
stage: <STAGE2>,
nReturned: <int>,
executionTimeMillisEstimate: <int>,
...
chunkSkips: <int>,
inputStage: {
stage: <STAGE3>,
...
numReads: <int>, // Starting in MongoDB 5.1
...
inputStage: {
...
}
}
}
},
...
]
}
allPlansExecution: [
{
shardName: <string>,
allPlans: [
{
nReturned: <int>,
executionTimeMillisEstimate: <int>,
totalKeysExamined: <int>,
totalDocsExamined:<int>,
executionStages: {
stage: <STAGEA>,
nReturned: <int>,
executionTimeMillisEstimate: <int>,
...
inputStage: {
stage: <STAGEB>,
...
inputStage: {
...
}
}
}
},
...
]
},
{
shardName: <string>,
allPlans: [
...
]
},
...
]
}
explain.executionStats

Contiene estadísticas que describen la ejecución del query completada para el plan ganador. Para las operaciones de guardado, la ejecución del query completada se refiere a las modificaciones que se realizarían, pero no aplica las modificaciones a la base de datos.

explain.executionStats.nReturned

Número de documentos devueltos por el plan del query ganador. nReturned corresponde al campo n devuelto por cursor.explain() en versiones anteriores de MongoDB.

explain.executionStats.executionTimeMillis

Tiempo total en milisegundos requerido para la selección del plan del query y la ejecución del query. Incluye el tiempo que se tarda en ejecutar la fase de prueba del proceso de selección del plan, pero no incluye el tiempo de red necesario para transmitir los datos de vuelta al cliente.

El tiempo reportado por explain.executionStats.executionTimeMillis no es necesariamente representativo del tiempo real del query. Durante las operaciones en estado estacionario (cuando el plan del query está almacenado en caché), o al usar cursor.hint() con cursor.explain(), MongoDB evita el proceso de selección del plan, lo que resulta en un tiempo real más rápido, llevando a un valor menor de explain.executionStats.executionTimeMillis .

explain.executionStats.totalKeysExamined

Número de entradas de índice escaneadas. explain.executionStats.totalKeysExamined corresponde al campo nscanned devuelto por cursor.explain() en versiones anteriores de MongoDB.

explain.executionStats.totalDocsExamined

Número de documentos examinados durante la ejecución del query. Las etapas comunes de ejecución del query que examinan documentos son COLLSCAN y FETCH.

Nota

explain.executionStats.totalDocsExamined se refiere al número total de documentos examinados y no al número de documentos devueltos. Por ejemplo, una etapa puede examinar un documento para aplicar un filtro. Si el documento es filtrado, entonces ha sido examinado pero no será devuelto como parte del conjunto de resultados del query.

Si un documento se examina varias veces durante la ejecución del query, explain.executionStats.totalDocsExamined cuenta cada examen. Es decir, explain.executionStats.totalDocsExamined no es un conteo del número total de documentos únicos examinados.

explain.executionStats.executionStages

Detalla la ejecución completa del plan ganador como un árbol de etapas; es decir, una etapa puede tener un inputStage o múltiples inputStages.

A partir de MongoDB 5.1, una etapa puede tener las siguientes etapas de entrada:

  • thenStage

  • elseStage

  • innerStage

  • outerStage

Cada etapa consta de información de ejecución específica para esa etapa.

explain.executionStats.executionStages.executionTimeMillisEstimate

El tiempo estimado en milisegundos para la ejecución de la query.

explain.executionStats.executionStages.opens

A partir de MongoDB 5.1, el número de veces que se abrió una etapa durante la ejecución del query.

explain.executionStats.executionStages.closes

A partir de MongoDB 5.1, el número de veces que se cerró una etapa durante la ejecución del query.

explain.executionStats.executionStages.works

Especifica el número de "unidades de trabajo" realizadas por la etapa de ejecución del query. La ejecución del query divide su trabajo en pequeñas unidades. Una "unidad de trabajo" puede consistir en examinar una única clave de índice, obtener un único documento de la colección, aplicar una proyección a un único documento o realizar una parte de la contabilidad interna.

Este campo aparece si la operación utilizó el motor de ejecución de query clásico.

explain.executionStats.executionStages.saveState

El número de veces que la etapa de query suspendió el Procesamiento y guardó su estado de ejecución actual, por ejemplo, en preparación para ceder sus bloqueos.

explain.executionStats.executionStages.restoreState

El número de veces que la etapa del query realizó la restauración de un estado de ejecución guardado, por ejemplo, recuperando los bloqueos que había cedido anteriormente.

explain.executionStats.executionStages.isEOF

Especifica si la etapa de ejecución ha alcanzado el final del flujo de datos:

  • Si true o 1, la etapa de ejecución ha alcanzado el final del flujo.

  • Si false o 0, la etapa aún puede tener resultados para devolver. Por ejemplo, considere un query con un límite cuyas etapas de ejecución consisten en una etapa LIMIT con una etapa de entrada de IXSCAN para el query. Si el query devuelve más del límite especificado, la etapa LIMIT informará isEOF: 1, pero su etapa subyacente IXSCAN informará isEOF: 0.

explain.executionStats.executionStages.inputStage

Cada inputStage puede tener diferentes campos según el valor de inputStage.stage. La siguiente tabla describe los campos posibles y las etapas en las que pueden aparecer.

Cada inputStage puede tener otro inputStage como un campo. Consultar Explicar la estructura de salida.

Campo
Descripción
Etapas aplicables

docsExamined

Especifica el número de documentos escaneados durante la etapa de ejecución de la query.

COLLSCAN, FETCH

keysExamined

Para las etapas de ejecución del query que escanean un índice, keysExamined es el número total de claves dentro y fuera de los límites que se examinan durante el proceso de escaneo del índice. Si el escaneo de índice consiste en un único rango contiguo de claves, solo es necesario examinar las claves dentro de los límites. Si los límites del índice consisten en varios rangos de claves, el proceso de ejecución del escaneo del índice puede examinar claves fuera de los límites para saltar desde el final de un rango al inicio del siguiente.

IXSCAN

numReads

El número de documentos escaneados o claves de índice examinadas durante la etapa de ejecución del query.

Nuevo en la versión 5.1.

COLLSCAN, IXSCAN

seeks

El número de veces que tuvimos que mover el cursor del índice a una nueva posición para completar el escaneo del índice.

IXSCAN

spilledBytesApprox

El número aproximado de bytes en memoria derramados en el disco en la etapa.

Novedades en la versión 5.3.

GROUP

spilledRecords

El número de registros producidos que se derramaron en el disco en el escenario.

Novedades en la versión 5.3.

GROUP

usedDisk

Si la etapa guardó en el disco.

Novedades en la versión 5.3.

GROUP

explain.executionStats.allPlansExecution

Contiene información parcial de ejecución capturada durante la fase de selección de planes para los planes ganadores y rechazados. El campo solo está presente si explain se ejecuta en la moda de nivel de verbosidad allPlansExecution.

explain.executionStats.operationMetrics

Contiene estadísticas de consumo de recursos, siempre que no sean cero. El campo solo está presente si se ejecuta explain en executionStats modo de detalle o superior y si profileOperationResourceConsumptionMetrics está habilitado.

Para las colecciones no particionadas, explain devuelve la siguiente información serverInfo para la instancia de MongoDB:

serverInfo: {
host: <string>,
port: <int>,
version: <string>,
gitVersion: <string>
}

Para las colecciones particionadas, explain devuelve el serverInfo para cada partición a la que se accede y un objeto serverInfo de nivel superior para el mongos.

queryPlanner: {
...
winningPlan: {
stage: <STAGE1>,
shards: [
{
shardName: <string>,
connectionString: <string>,
serverInfo: {
host: <string>,
port: <int>,
version: <string>,
gitVersion: <string>
},
...
}
...
]
}
},
serverInfo: { // serverInfo for mongos
host: <string>,
port: <int>,
version: <string>,
gitVersion: <string>
}
...

Nuevo en la versión 5.0.

Los resultados de explain pueden incluir estadísticas de ejecución para queries que utilizan una etapa de $lookup del pipeline. Para incluir esas estadísticas de ejecución, se debe Ejecutar la Operación 'explain' en uno de estos niveles de verbosidad de ejecución:

Los siguientes campos se incluyen en los resultados de explicación para un query $lookup :

'$lookup': {
from: <string>,
as: <string>,
localField: <string>,
foreignField: <string>
},
totalDocsExamined: <long>,
totalKeysExamined: <long>,
collectionScans: <long>,
indexesUsed: [ <string_1>, <string_2>, ..., <string_n> ],
executionTimeMillisEstimate: <long>

Para ver las descripciones de los campos en la sección $lookup, consulte la página $lookup.

Los otros campos son:

explain.totalDocsExamined

Número de documentos examinados durante la ejecución del query.

explain.totalKeysExamined

Número de claves de índice examinadas.

explain.collectionScans

Número de veces que se produjo un escaneo de colección durante la ejecución del query. Durante un escaneo de colección, cada documento en una colección se compara con el predicado del query. Los escaneos de colección ocurren si no existe un índice apropiado que cubra el query.

explain.indexesUsed

Arreglo de strings con los nombres de los índices utilizados por el query.

explain.executionTimeMillisEstimate

Tiempo estimado en milisegundos para la ejecución de los queries.

Si el planificador de queries selecciona un escaneo de colección, el resultado de explain incluye una etapa COLLSCAN.

Si el planificador del query selecciona un índice, el resultado de la explicación incluye una etapa IXSCAN. La etapa incluye información como el patrón de claves del índice, la dirección de recorrido y los límites del índice.

A partir de MongoDB 5.3, si el planificador de queries selecciona un índice clusterizado para una colección con índice clusterizado y el query contiene límites que definen la parte del índice a buscar, el resultado de explain incluye una etapa CLUSTERED_IXSCAN. La etapa incluye información sobre la clave del índice agrupado y los límites del índice.

Si el planificador de query selecciona un índice agrupado para una colección con índice clusterizado y la query no contiene límites, la query realiza un escaneo de colección sin límites y el resultado de explain incluye una etapa COLLSCAN.

Nota

El parámetro notablescan no permite queries ilimitados que utilizan un índice agrupado porque los queries requieren un escaneo de colección completo.

Para aprender más sobre las estadísticas de ejecución de los escaneos de colección, se puede consultar Interpretar los resultados del plan de ejecución.

Cuando un índice cubre un query, MongoDB puede tanto hacer coincidir las condiciones del query como devolver los resultados utilizando solo las claves del índice. MongoDB no necesita examinar documentos de la colección para realizar ninguna parte del query.

Cuando un índice cubre un query, el resultado de la explicación tiene una etapa IXSCAN que no es descendiente de una etapa FETCH, y en el executionStats, el explain.executionStats.totalDocsExamined es 0.

Si MongoDB utiliza índices para una expresión $or, el resultado incluirá la etapa OR con un arreglo explain.queryPlanner.winningPlan.inputStages que detalla los índices; por ejemplo:

{
stage: 'OR',
inputStages: [
{
stage: 'IXSCAN',
...
},
{
stage : 'IXSCAN',
...
},
...
]
}

En versiones anteriores de MongoDB, cursor.explain() devolvía el arreglo clauses que detallaba los índices.

Cuando explain se ejecuta en moda de nivel de verbosidad executionStats o allPlansExecution, las etapas $sort y $group tienen salida adicional.

Etapa
Campo
Tipo
Descripción

totalDataSizeSortedBytesEstimate

long

Un número estimado de bytes procesados en la etapa $sort.

usedDisk

booleano

Si la etapa $sort escribió en el disco.

totalOutputDataSizeBytes

long

Una estimación del tamaño total de todos los documentos generados por la etapa en $group bytes.

usedDisk

booleano

Si la etapa $group escribió en el disco.

spillFileSizeBytes

long

El tamaño del archivo de derrame escrito en el disco en la $group etapa. Debido a la compresión, el valor de spillFileSizeBytes debe ser menor o igual numBytesSpilledEstimate a.

numBytesSpilledEstimate

long

Una estimación del número de bytes escritos en el disco en la etapa de $group antes de la compresión.

Si MongoDB no puede utilizar un índice o índices para obtener el orden de clasificación, los resultados incluyen una etapa SORT que indica una operación de clasificación en memoria. Si el plan de ejecución no contiene una etapa explícita SORT, entonces MongoDB utilizó un índice para obtener el orden de clasificación.

Volver

Analizar el rendimiento del query

En esta página