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.
Análisis del plan de consultas
El análisis del plan de consultas mediante la explicación del plan proporciona información esencial sobre el rendimiento de las consultas en Amazon DocumentDB. El plan de consultas con ExecutionStats revela métricas clave que incluyen:
-
Documentos devueltos por etapa (nReturned)
-
Tiempos de ejecución específicos de cada etapa (estimados) executionTimeMillis
-
Duración de la generación del plan () planningTimeMillis
Al examinar el resultado del plan de consultas, los desarrolladores pueden analizar los patrones de ejecución, evaluar la utilización de los índices e identificar las posibles oportunidades de optimización en todas las etapas del proceso de consulta.
Para analizar el plan de consultas, puede usar el comando explain () en los siguientes formatos.
db.runCommand({explain: {query document}, verbosity: "executionStats"}) db.collection.find().explain("executionStats");
A continuación se muestra un ejemplo de operación:
db.collection.find({ companyname: { '$eq': 'ANYCOMPANY' }, isDeleted: { '$eq': false } }).sort({"createdAt":1}).limit(2).explain("executionStats");
La salida de esta operación será similar a lo que se indica a continuación:
{ queryPlanner: { plannerVersion: 2, namespace: 'limit_test.test', winningPlan: { stage: 'LIMIT_SKIP', inputStage: { stage: 'SORT', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, indexFilterSet: false, indexFilterApplied: false, executionStats: { executionSuccess: true, executionTimeMillis: '4.186', planningTimeMillis: '3.909', executionStages: { stage: 'LIMIT_SKIP', nReturned: '2', executionTimeMillisEstimate: '0.199', inputStage: { stage: 'SORT', nReturned: '2', executionTimeMillisEstimate: '0.197', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', nReturned: '34', executionTimeMillisEstimate: '0.151', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, serverInfo: { host: 'demo-cluster', port: 27017, version: '5.0.0' }, ok: 1, operationTime: Timestamp({ t: 1759915116, i: 1 }) }
A continuación, se incluye un análisis detallado del plan de ejecución de consultas de Amazon DocumentDB, en el que se desglosan cada componente y sus características de rendimiento.
Plazo general
executionTimeMillis representa el tiempo total que tardó la consulta, incluido el tiempo de planificación.
planningTimeMillis representa el tiempo total de planificación que tardó la consulta.
Etapas de ejecución
Describe el step-by-step proceso que Amazon DocumentDB utiliza para ejecutar una consulta y muestra cómo fluyen los datos a través de diferentes operaciones.
"executionStages": { "stage": "[STAGE_NAME]", "nReturned": "[NUMBER_OF_DOCS]", "executionTimeMillisEstimate": "[TIME]", "inputStage": { // Nested stages } }
Etapas comunes de un plan de consultas
A continuación, se muestran las etapas de ejecución habituales de un plan de consultas. Cada etapa devuelve las métricas executionTimeMillis Estimate (tiempo de ejecución) y nReturned (cantidad de documentos) para ayudar a evaluar el rendimiento de las consultas en cada etapa.
COLLSCAN (escaneo de colecciones)
-
Escanea toda la colección, documento por documento
-
nReturned: devuelve todos los documentos coincidentes de la colección
-
Puede ser una operación costosa, vista cuando no hay un índice disponible
IXSCAN (escaneo de índices)
-
Utiliza un índice para buscar documentos coincidentes
-
nReturned: solo los documentos coincidentes según el índice
-
Funcionamiento eficiente, preferido a COLLSCAN
SORT
-
Ordena los documentos en función de los campos especificados
-
Si el atributo de ordenación de la consulta no forma parte de un índice, esta etapa aparecerá de forma explícita
-
nReturned: el mismo número que los documentos de entrada
-
Uso intensivo de memoria para conjuntos de resultados de gran tamaño. Para optimizarlo, añada el nombre del campo de ordenación a un índice
LIMIT_SKIP
-
Controla el número de documentos devueltos y omitidos
-
nReturnado: limitado por el valor LÍMITE
-
Se utiliza para operaciones de paginación o LIMIT
SUBESCANEO
-
Realiza operaciones de consulta anidadas
-
nReturned: varía según los resultados de la subconsulta
-
Se utiliza en consultas complejas con múltiples etapas
Las etapas con una executionTimeMillis estimación alta son buenas candidatas para la optimización.
nota
El parámetro ExecutionStats no admite actualmente los comandos de actualización y eliminación.
Comprensión de los documentos examinados en Explicar las estadísticas de ejecución del plan
Cuando ejecuta una consultaexplain("executionStats"), Amazon DocumentDB proporciona métricas de examen que le ayudan a comprender cuántos documentos se escanearon para generar los resultados de la consulta. Estas métricas son útiles para identificar planes de consultas ineficientes y optimizar el rendimiento.
nota
Disponible solo en Amazon DocumentDB 8.0.0+.
Fields
| Campo | Description (Descripción) | Nivel |
|---|---|---|
| totalDocsExamined | Número total de documentos examinados en todas las etapas de ejecución. | ExecutionStats de nivel superior |
| Documentos examinados | Número de documentos examinados en una etapa de ejecución específica. | A nivel de fase |
El docsExamined campo aparece en las siguientes etapas:
| Etapa | Description (Descripción) |
|---|---|
| COLLSCAN | Escaneo de colecciones. Se examinan todos los documentos de la colección. |
| IXSCAN | Escaneo de índices. Solo se examinan los documentos que coinciden con la condición del índice. |
| FETCH | Cuando el optimizador recupera los documentos en una etapa separada de la del IXSCAN, la etapa FETCH informa sobre DocsExamined. En los planes de digitalización indexada, las etapas secundarias del IXSCAN no incluyen DocsExamined. En los planes $lookup, tanto la etapa FETCH como sus etapas secundarias pueden incluir DocsExamined. |
nota
docsExaminedno aparece en las etapas de IXONLYSCAN porque la consulta se resuelve completamente desde el índice sin acceder a los documentos.
Mostrar los documentos examinados en el resultado de Explain Plan ExecutionStats
En los ejemplos siguientes se utiliza una colección de 500 000 documentos y se muestra cómo docsExamined cambia en las distintas etapas de ejecución de las consultas.
Cree datos de muestra:
for (let i = 0; i < 500000; i++) { db.coll.insertOne({ number: i, arr: [i, [i+1]], value: "test", bool: i % 2 === 0 }); }
Escaneo de colecciones (COLLSCAN)
Sin un índice, Amazon DocumentDB realiza un escaneo completo de la colección.
db.coll.find({ "number": { "$lt": 500 } }).explain("executionStats").executionStats
Salida:
{ "executionSuccess" : true, "nReturned" : "500", "executionTimeMillis" : "282.055", "planningTimeMillis" : "0.085", "totalDocsExamined" : "500000", "executionStages" : { "stage" : "COLLSCAN", "nReturned" : "500", "executionTimeMillisEstimate" : "281.915", "docsExamined" : "500000", "filter" : { "number" : { "$lt" : 500 } } } }
Se examinaron los 500 000 documentos para obtener 500 resultados. La creación de un índice en el campo numérico mejora esta situación.
Escaneo de índices (IXSCAN)
db.coll.createIndex({ number: 1 }); db.coll.find({ "number": { "$lt": 5000 } }).explain("executionStats").executionStats
Salida:
{ "executionSuccess" : true, "nReturned" : "5000", "executionTimeMillis" : "3.047", "planningTimeMillis" : "0.296", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "5000", "executionTimeMillisEstimate" : "2.576", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] } } }
Con el índice, solo se examinaron y buscaron 5000 de los 500 000 documentos, lo que coincidió con el número devuelto. La condición de índice filtró 495 000 documentos que no coincidían con la consulta.
Escaneo de índices con filtro residual
db.coll.find({ "number": { "$lt": 5000 }, "arr": { "$gt": 4000 } }).explain("executionStats").executionStats
Salida:
{ "executionSuccess" : true, "nReturned" : "999", "executionTimeMillis" : "15.367", "planningTimeMillis" : "0.115", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "999", "executionTimeMillisEstimate" : "15.170", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] }, "filter" : { "arr" : { "$gt" : 4000 } } } }
La condición del índice coincidió con 5000 documentos de un total de 500 000 y, a continuación, el filtro residual activado arr redujo el resultado a 999. El docsExamined valor de 5000 refleja todos los documentos examinados después de la condición de indexación, pero antes de aplicar el filtro residual.
Realice la búsqueda con IXSCAN
db.coll.find({ "$or": [{ "number": { "$lt": 100000 } }, { "number": { "$gt": 400000 } }] }).explain("executionStats").executionStats
Salida:
{ "executionSuccess" : true, "nReturned" : "199999", "executionTimeMillis" : "899.801", "planningTimeMillis" : "0.183", "totalDocsExamined" : "199999", "executionStages" : { "stage" : "FETCH", "nReturned" : "199999", "executionTimeMillisEstimate" : "894.141", "docsExamined" : "199999", "inputStage" : { "stage" : "IXOR", "nReturned" : "0", "executionTimeMillisEstimate" : "874.897", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "100000", "executionTimeMillisEstimate" : "462.208", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$lt" : 100000 } } ] } }, { "stage" : "IXSCAN", "nReturned" : "99999", "executionTimeMillisEstimate" : "412.684", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$gt" : 400000 } } ] } } ] } } }
Cuando el optimizador de Amazon DocumentDB utiliza una etapa de recuperación para recuperar documentos, la etapa FETCH informa. docsExamined Las etapas secundarias de IXSCAN no generan informes docsExamined porque solo escanean claves de índice sin acceder directamente a los documentos.
FETCH con búsqueda agregada
db.coll.explain("executionStats").aggregate([ { $match: { "number": { "$lt": 5 } } }, { $lookup: { from: "coll", pipeline: [{ $match: { "number": { "$lt": 3 } } }], as: "sub" } } ]).executionStats
Salida:
{ "executionSuccess" : true, "nReturned" : "5", "executionTimeMillis" : "0.525", "planningTimeMillis" : "0.327", "totalDocsExamined" : "9", "executionStages" : { "stage" : "NESTED_LOOP_LOOKUP", "nReturned" : "5", "executionTimeMillisEstimate" : "0.163", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "5", "executionTimeMillisEstimate" : "0.039", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5 } } ] } }, { "stage" : "FETCH", "nReturned" : "1", "executionTimeMillisEstimate" : "0.009", "docsExamined" : "1", "inputStage" : { "stage" : "AGGREGATE", "nReturned" : "1", "executionTimeMillisEstimate" : "0.044", "inputStage" : { "stage" : "IXSCAN", "nReturned" : "3", "executionTimeMillisEstimate" : "0.013", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "3", "indexCond" : { "$and" : [ { "number" : { "$lt" : 3 } } ] } } } } ] } }
El IXSCAN externo examinó 5 documentos cuyo número era inferior a 5. El IXSCAN interno examinó 3 documentos que coincidían con un número inferior a 3 y la etapa FETCH examinó 1 resultado agregado. El totalDocsExamined número 9 es la suma de todas las etapas (5 + 3 + 1).