利用查询解释 (Query Explain) 分析查询执行情况

本页面介绍了如何在执行查询时检索查询执行信息。

使用查询解释

使用查询解释功能来了解查询的执行方式。 这会提供可用于优化查询的详细信息。

您可以通过 Google Cloud 控制台或使用 Firestore 服务器客户端库来使用查询解释。

控制台

在查询编辑器中执行查询,然后打开解释 标签页:

  1. 在 Google Cloud 控制台中,前往数据库页面。

    前往“数据库”

  2. 从数据库列表中,选择一个 Firestore 数据库。 控制台会为该数据库打开 Firestore Explorer 。 Google Cloud
  3. 在查询编辑器中输入查询,然后点击运行
  4. 点击解释 标签页以查看查询分析输出。

Node.js(管理员)
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(管理员)
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);
}

解释模式

根据您要调试的内容,您可以使用查询解释功能以不同模式执行查询:

  • analyze:规划并执行查询。返回规划器信息、运行时执行统计信息和指标,以及查询生成的常规结果。

  • explain:规划查询,但不执行查询。返回规划器信息,但不返回运行时统计信息、指标或结果。这对于调试查询的行为而不运行代价高昂的操作非常有用。

分析

查询解释的输出包含两个主要组成部分:摘要统计信息和执行树。 请考虑以下查询示例:

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

摘要统计信息

解释性输出的顶部包含执行统计信息的摘要。使用这些统计信息可确定查询是否具有高延迟或高费用。它还包含内存统计信息,可让您了解查询与内存限制的接近程度。

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

执行树

执行树会将查询执行描述为一系列节点。底部节点(叶节点)会从存储层检索数据,然后向上遍历树以生成查询响应。

如需详细了解每个执行节点,请参阅执行参考文档

如需详细了解如何使用这些信息来优化查询,请参阅优化查询执行

以下是执行树示例:

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

后续步骤