Analizar la ejecución de consultas con Query Explain

En esta página se describe cómo obtener información sobre la ejecución de una consulta.

Usar Explicación de consulta

Puedes usar Explicación de la consulta para saber cómo se ejecutan tus consultas. Aquí se proporcionan detalles que puedes usar para optimizar tus consultas.

Puedes usar Query Explain a través de la Google Cloud consola o del comando explain.

Consola

Ejecuta una consulta en el Editor de consultas y abre la pestaña Explicación:

  1. En la Google Cloud consola, ve a la página Bases de datos.

    Ir a Bases de datos

  2. En la lista de bases de datos, selecciona una base de datos de Firestore con compatibilidad con MongoDB. La Google Cloud consola abre el Explorador de Firestore de esa base de datos.
  3. En el editor de consultas, escribe una consulta y haz clic en Ejecutar.
  4. Haga clic en la pestaña Explicación para ver el resultado del análisis de la consulta.

    Pestaña Explicación de la consulta en la consola
API de MongoDB

La consulta Explain en la API de MongoDB se admite mediante el comando explain que puedes usar en herramientas como Mongo Shell y Compass.

El comando explain es compatible con los comandos aggregate, find, distinct y count. Por ejemplo:

db.collection.explain.find(...)

También puedes usar el método explain(), por ejemplo:

db.collection.find({QUERY}).explain()
Limitaciones
Ten en cuenta las siguientes limitaciones y diferencias:
  • Query Explain no admite comandos que devuelvan un cursor. Por ejemplo, no se admite invocar la función de explicación llamando directamente al siguiente comando:

    db.collection.aggregate(..., explain: true)
  • Query Explain solo se admite en los comandos find, aggregate, count y distinct.

  • Las opciones Verbosity y Comment de Query Explain no se admiten a través de la API de MongoDB. El comportamiento coincide con la opción executionStats. Las opciones allPlansExecution y queryPlanner se ignoran si se proporcionan.

Análisis

El resultado de Query Explain contiene dos componentes principales: las estadísticas de resumen y el árbol de ejecución. Por ejemplo, echa un vistazo a esta consulta:

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

Estadísticas de resumen

En la parte superior de la salida explicada se muestra un resumen de las estadísticas de ejecución. Usa estas estadísticas para determinar si una consulta tiene una latencia o un coste elevados. También contiene estadísticas de memoria que te indican lo cerca que está tu consulta de los límites de memoria.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

Árbol de ejecución

El árbol de ejecución describe la ejecución de la consulta como una serie de nodos. Los nodos inferiores (nodos hoja) recuperan datos de la capa de almacenamiento, que recorre el árbol hacia arriba para generar una respuesta a la consulta.

Para obtener información detallada sobre cada nodo de ejecución, consulta la referencia de ejecución.

Para obtener información sobre cómo usar esta información para optimizar tus consultas, consulta Optimizar la ejecución de consultas.

A continuación, se muestra un ejemplo de un árbol de ejecución:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

Siguientes pasos