使用查询解释分析查询执行情况

仅与 Cloud Firestore 企业版相关。

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

使用查询解释

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

您可以通过 Google Cloud 控制台或 explain 命令来使用查询解释。

控制台

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

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

    前往“数据库”

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

    控制台中的“查询解释”标签页
MongoDB API

通过 explain 命令为 MongoDB API 中的查询解释提供支持,您可以在 Mongo Shell 和 Compass 等工具中使用该命令。

aggregatefinddistinctcount 命令支持 explain 命令,例如:

db.collection.explain('executionStats').find(...)

您还可以使用 explain() 方法,例如:

db.collection.find({QUERY}).explain('executionStats')
限制
请注意以下限制和差异:
  • 查询解释不支持返回游标的命令。例如,不支持通过直接调用以下命令来调用解释:

    db.collection.aggregate(..., explain: true)
  • 只有 findaggregatecountdistinct 命令支持查询解释。

  • 通过 MongoDB API 不支持查询解释的 VerbosityComment 选项。此行为与 executionStats 选项匹配。如果提供了 allPlansExecutionqueryPlanner 选项,系统会忽略这些选项。

    如果未提供详细程度,Shell 会使用 queryPlanner 详细程度并过滤掉执行统计信息。您必须使用 executionStatsallPlansExecution 详细程度才能看到完整输出。

分析

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

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

摘要统计信息

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

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

执行树

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

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

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

以下是执行树示例:

• 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 

后续步骤