使用「查詢說明」分析查詢執行作業

本頁說明如何執行查詢時擷取查詢執行資訊。

使用查詢說明

您可以使用「查詢說明」瞭解查詢的執行方式。 這項資訊可協助您最佳化查詢

您可以透過 Google Cloud 控制台或 explain 指令使用查詢說明。

控制台

在查詢編輯器中執行查詢,然後開啟「說明」分頁:

  1. 前往 Google Cloud 控制台的「Databases」頁面。

    前往「資料庫」

  2. 從資料庫清單中,選取與 MongoDB 相容的 Firestore 資料庫。 Google Cloud 控制台會開啟該資料庫的「Firestore Explorer」
  3. 在查詢編輯器中輸入查詢,然後點選「Run」(執行)
  4. 按一下「說明」分頁標籤,即可查看查詢分析輸出內容。

    主控台中的「查詢說明」分頁
MongoDB API

MongoDB API 支援 Query Explain,您可以使用 explain 指令,在 Mongo Shell 和 Compass 等工具中執行這項功能。

explain 指令支援 aggregatefinddistinctcount 指令,例如:

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

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

db.collection.find({QUERY}).explain()
限制
請注意下列限制和差異:
  • 查詢說明不支援傳回游標的指令。舉例來說,系統不支援直接呼叫下列指令來叫用說明:

    db.collection.aggregate(..., explain: true)
  • 查詢說明僅支援 findaggregatecountdistinct 指令。

  • MongoDB API 不支援 Query Explain 的 VerbosityComment 選項。這個行為與 executionStats 選項相符。如果提供 allPlansExecutionqueryPlanner 選項,系統會忽略這些選項。

分析

查詢說明的輸出內容包含兩個主要元件:摘要統計資料和執行樹狀結構。 以這個查詢為例:

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

後續步驟