使用查詢說明功能分析查詢執行作業

僅適用於 Cloud Firestore Enterprise 版。

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

使用查詢說明

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

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

控制台

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

  1. 前往 Google Cloud 控制台的「資料庫」頁面。

    前往「資料庫」

  2. 從資料庫清單中,選取與 MongoDB 相容的 Cloud Firestore 資料庫。 Google Cloud 控制台會開啟該資料庫的「Firestore Explorer」(Firestore 探索工具)
  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

後續步驟