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.
Explique la estructura de salida
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:
COLLSCANpara un escaneo de colecciónIXSCANpara el escaneo de claves de índiceFETCHpara la recuperación de documentosGROUPpara la agrupación de documentosSHARD_MERGEpara combinar resultados de fragmentosSHARDING_FILTERpara el filtrado de documentos huérfanos de los fragmentosBATCHED_DELETEpara el borrado de múltiples documentos que se agrupan internamente (a partir de MongoDB 6.1)
Se pueden explicar los resultados para MongoDB 5.1 y versiones posteriores
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.explainVersionCampo de enteros.
explainVersiones la versión del formato de salida para el plan, como"1"o"2".Nuevo en la versión 5.1.
queryPlanner
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.queryPlannerContiene información sobre la selección del plan del query por parte del optimizador del query.
explain.queryPlanner.namespaceUna 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.indexFilterSetUn valor booleano que especifica si MongoDB aplicó un filtro de índice para la forma de la consulta.
explain.queryPlanner.queryHashUna cadena hexadecimal que representa el hash de la forma de consulta y depende únicamente de las formas de consulta.
queryHashpuede 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
queryHashy,planCacheKeyconsultequeryHashy.planCacheKey
explain.queryPlanner.planCacheKeyUn hash de la clave para la entrada de caché del plan asociada con el query.
A diferencia
explain.queryPlanner.queryHashde, 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.planCacheKeyelplanCacheKeyvalor de podría cambiar, mientras que elqueryHashde no cambiaría.Para obtener más información sobre
queryHashy,planCacheKeyconsultequeryHashy.planCacheKey
explain.queryPlanner.optimizationTimeMillisTiempo 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.optimizedPipelineUn 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
truey solo se aplica para explicar en las operaciones del pipeline de agregación. Cuandotrue, dado que el pipeline fue optimizado, no aparece información sobre la etapa de agregación en la salida.
explain.queryPlanner.winningPlanUn documento que detalla el plan seleccionado por el optimizador del query.
explain.queryPlanner.winningPlan.stageUna string que indica el nombre de la etapa.
Cada etapa consta de información específica de la etapa. Por ejemplo, una etapa
IXSCANincluye 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á uninputStageoinputStages.Este campo aparece si la operación utilizó el motor de ejecución de query clásico.
explain.queryPlanner.winningPlan.inputStageUn 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.inputStagesUn 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.queryPlanUn 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.stageUna string que indica el nombre de la etapa.
Cada etapa consta de información específica para esa etapa. Por ejemplo, una etapa
IXSCANincluye los límites del índice junto con otros datos específicos de la exploración del índice.
explain.queryPlanner.winningPlan.queryPlan.planNodeIdCampo 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.inputStageSe puede consultar
explain.queryPlanner.winningPlan.inputStage.
executionStats
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:
Modo de verbosidad de allPlansExecution. Se puede utilizar el modo
allPlansExecutionpara incluir los datos de ejecución parcial capturados durante la selección del plan.
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.executionStatsContiene 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.nReturnedNúmero de documentos devueltos por el plan del query ganador.
nReturnedcorresponde al campondevuelto porcursor.explain()en versiones anteriores de MongoDB.
explain.executionStats.executionTimeMillisTiempo 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.executionTimeMillisno 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 usarcursor.hint()concursor.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 deexplain.executionStats.executionTimeMillis.
explain.executionStats.totalKeysExaminedNúmero de entradas de índice escaneadas.
explain.executionStats.totalKeysExaminedcorresponde al camponscanneddevuelto porcursor.explain()en versiones anteriores de MongoDB.
explain.executionStats.totalDocsExaminedNúmero de documentos examinados durante la ejecución del query. Las etapas comunes de ejecución del query que examinan documentos son
COLLSCANyFETCH.Nota
explain.executionStats.totalDocsExaminedse 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.totalDocsExaminedcuenta cada examen. Es decir,explain.executionStats.totalDocsExaminedno es un conteo del número total de documentos únicos examinados.
explain.executionStats.executionStagesDetalla la ejecución completa del plan ganador como un árbol de etapas; es decir, una etapa puede tener un
inputStageo múltiplesinputStages.A partir de MongoDB 5.1, una etapa puede tener las siguientes etapas de entrada:
thenStageelseStageinnerStageouterStage
Cada etapa consta de información de ejecución específica para esa etapa.
explain.executionStats.executionStages.executionTimeMillisEstimateEl tiempo estimado en milisegundos para la ejecución de la query.
explain.executionStats.executionStages.opensA partir de MongoDB 5.1, el número de veces que se abrió una etapa durante la ejecución del query.
explain.executionStats.executionStages.closesA partir de MongoDB 5.1, el número de veces que se cerró una etapa durante la ejecución del query.
explain.executionStats.executionStages.worksEspecifica 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.saveStateEl 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.restoreStateEl 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.isEOFEspecifica si la etapa de ejecución ha alcanzado el final del flujo de datos:
Si
trueo1, la etapa de ejecución ha alcanzado el final del flujo.Si
falseo0, 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 etapaLIMITcon una etapa de entrada deIXSCANpara el query. Si el query devuelve más del límite especificado, la etapaLIMITinformaráisEOF: 1, pero su etapa subyacenteIXSCANinformaráisEOF: 0.
explain.executionStats.executionStages.inputStageCada
inputStagepuede tener diferentes campos según el valor deinputStage.stage. La siguiente tabla describe los campos posibles y las etapas en las que pueden aparecer.Cada
inputStagepuede tener otroinputStagecomo un campo. Consultar Explicar la estructura de salida.CampoDescripciónEtapas aplicablesdocsExaminedEspecifica el número de documentos escaneados durante la etapa de ejecución de la query.
COLLSCAN,FETCHkeysExaminedPara las etapas de ejecución del query que escanean un índice,
keysExaminedes 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.IXSCANnumReadsEl 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,IXSCANseeksEl número de veces que tuvimos que mover el cursor del índice a una nueva posición para completar el escaneo del índice.
IXSCANspilledBytesApproxEl número aproximado de bytes en memoria derramados en el disco en la etapa.
Novedades en la versión 5.3.
GROUPspilledRecordsEl número de registros producidos que se derramaron en el disco en el escenario.
Novedades en la versión 5.3.
GROUPusedDiskSi la etapa guardó en el disco.
Novedades en la versión 5.3.
GROUP
explain.executionStats.allPlansExecutionContiene 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
explainse ejecuta en la moda de nivel de verbosidadallPlansExecution.
explain.executionStats.operationMetricsContiene estadísticas de consumo de recursos, siempre que no sean cero. El campo solo está presente si se ejecuta
explainenexecutionStatsmodo de detalle o superior y siprofileOperationResourceConsumptionMetricsestá habilitado.
serverInfo
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> } ...
Estadísticas del plan de ejecución para la consulta con $lookup la etapa de canalización
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.collectionScansNú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.
Escaneo de colección
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.
Consultas cubiertas
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.
$or expresión
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.
$sort y $group Etapas
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 |
|---|---|---|---|
| long | Un número estimado de bytes procesados en la etapa | |
| booleano | Si la etapa | |
| long | Una estimación del tamaño total de todos los documentos generados por la etapa en | |
| booleano | Si la etapa | |
| long | El tamaño del archivo de derrame escrito en el disco en la | |
| long | Una estimación del número de bytes escritos en el disco en la etapa de |
Etapa de ordenamiento
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.