Analiza la ejecución de consultas con Query Explain

En esta página, se describe cómo recuperar información sobre la ejecución de consultas cuando ejecutas una consulta.

Usa la función Query Explain

Usa Query Explain para comprender cómo se ejecutan tus consultas. Esto proporciona detalles que puedes usar para optimizar tus consultas.

Puedes usar Query Explain a través de la Google Cloud consola o con las bibliotecas cliente del servidor de Firestore.

Console

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

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

    Ir a Bases de datos

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

Node.js (Administrador)
const q = db.pipeline()
        .collection('/users')
        .sort(field('status').ascending())
        .limit(100);
let results;
try {
    results = await q.execute({
        explainOptions: { mode: 'analyze', outputFormat: 'text' }
    });
} catch (error) {
    console.log(error);
}
const metrics = results?.explainStats?.text;

console.log(metrics);
Java (Administrador)
Pipeline q = db.pipeline()
        .collection("/users")
        .sort(field("status").ascending())
        .limit(100);

PipelineExecuteOptions pipelineOpts = new PipelineExecuteOptions().withExplainOptions(
        new ExplainOptions().withExecutionMode(ExplainOptions.ExecutionMode.ANALYZE)
);
Pipeline.Snapshot result = q.execute(pipelineOpts).get();

String metrics = null;
if (result.getExplainStats() != null) {
    metrics = result.getExplainStats().getText();
    System.out.println(metrics);
}

Modos de explicación

Según lo que quieras depurar, puedes ejecutar una consulta con la Explicación de consultas en diferentes modos:

  • analyze: Planifica y ejecuta la consulta. Devuelve información del planificador, estadísticas y métricas de ejecución del tiempo de ejecución, junto con los resultados normales que produce la consulta.

  • explain: Planifica la consulta, pero no la ejecuta. Devuelve la información del planificador, pero no las estadísticas, las métricas ni los resultados del tiempo de ejecución. Esto es útil para depurar el comportamiento de una consulta sin ejecutar operaciones costosas.

Análisis

El resultado de Query Explain contiene dos componentes principales: las estadísticas de resumen y el árbol de ejecución. Considera esta consulta como ejemplo:

db.pipeline().collection('/users').sort(field("status").ascending()).limit(100)

Estadísticas de resumen

La parte superior del resultado explicado contiene un resumen de las estadísticas de ejecución. Usa estas estadísticas para determinar si una búsqueda tiene una latencia o un costo altos. También contiene estadísticas de memoria que te permiten saber qué tan cerca está tu consulta de los límites de memoria.

Execution:
 results returned: 2
 request peak memory usage: 20.25 KiB (20,736 B)
 data bytes read: 148 B
 entity row scanned: 2

Billing:
 read units: 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 detalles sobre cada nodo de ejecución, consulta la referencia de ejecución.

Si deseas obtener detalles para usar esta información y optimizar tus consultas, revisa Optimiza la ejecución de consultas.

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

Tree:
• Compute
|  $out_1: map_set($record_1, "__name__", $__name___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 2
|   latency: 5.96 ms (local <1 ms)
|
└── • Compute
    |  $__name___1: map_get($record_1, "__key__")
    |
    |  Execution:
    |   records returned: 2
    |   latency: 5.88 ms (local <1 ms)
    |
    └── • MajorSort
        |  fields: [$v_1 ASC]
        |  output: [$record_1]
        |  limit: 100
        |
        |  Execution:
        |   records returned: 2
        |   latency: 5.86 ms (local <1 ms)
        |   peak memory usage: 20.25 KiB (20,736 B)
        |
        └── • Compute
            |  $v_1: map_get($record_1, "status")
            |
            |  Execution:
            |   records returned: 2
            |   latency: 5.23 ms (local <1 ms)
            |
            └── • TableScan
                   source: /users
                   order: UNDEFINED
                   properties: *
                   row range: (-∞..+∞)
                   output record: $record_1
                   variables: [$record_1]

                   Execution:
                    records returned: 2
                    latency: 4.68 ms
                    records scanned: 2
                    data bytes read: 148 B

¿Qué sigue?