Query Explain を使用してクエリ実行を分析する

このページでは、クエリの実行時にクエリ実行情報を取得する方法について説明します。

クエリ Explain を使用する

Query Explain を使用すると、クエリの実行方法を把握できます。 これにより、クエリを最適化するために使用できる詳細情報が提供されます。

Query Explain は、 Google Cloud コンソールまたは explain コマンドを使用して確認できます。

コンソール

クエリエディタでクエリを実行し、[説明] タブを開きます。

  1. Google Cloud コンソールで、[データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストから、MongoDB 互換の Firestore データベースを選択します。 Google Cloud コンソールで、そのデータベースの Firestore エクスプローラが開きます。
  3. クエリエディタにクエリを入力し、[実行] をクリックします。
  4. [説明] タブをクリックして、クエリ分析の出力を表示します。

    コンソールの [Query Explain] タブ
MongoDB API

MongoDB API の Query Explain は、Mongo Shell や Compass などのツールで使用できる explain コマンドでサポートされています。

explain コマンドは、aggregatefinddistinctcount コマンドでサポートされています。次に例を示します。

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

explain() メソッドを使用することもできます。次に例を示します。

db.collection.find({QUERY}).explain('executionStats')
制限事項
次の制限事項と相違点に注意してください。
  • Query Explain は、カーソルを返すコマンドをサポートしていません。たとえば、次のコマンドを直接呼び出して Explain を呼び出すことはサポートされていません。

    db.collection.aggregate(..., explain: true)
  • Query Explain は、findaggregatecountdistinctupdatedeletefindAndModify コマンドでのみサポートされています。

  • Query Explain は、executionStatsallPlansExecutionqueryPlanner の詳細モードをサポートしています。

    • queryPlanner: クエリを実行せずに実行プランのみを返します。
    • executionStatsallPlansExecution: 実行プランと、課金、メモリ、実行の統計情報を返します。

    詳細モードが指定されていない場合、シェルはデフォルトで queryPlanner になります。実行統計の全体を表示するには、executionStats または allPlansExecution の詳細モードを指定する必要があります。

分析

Query Explain の出力には、統計情報の概要と実行ツリーの 2 つの主要コンポーネントが含まれています。次のクエリを例として考えてみましょう。

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

統計情報の概要

Query Explain の出力の上部には、実行統計の概要が表示されます。これらの統計情報を使用して、クエリのレイテンシや費用が高いかどうかを判断します。これには、クエリがメモリ上限にどの程度近づいているかを示すメモリ統計情報も含まれています。

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

実行ツリー

実行ツリーは、クエリ実行を一連のノードとして記述します。最下部のノード(リーフノード)は、ストレージ レイヤからデータを取得し、ツリーを上方向に走査してクエリ レスポンスを生成します。

各実行ノードの詳細については、実行のリファレンスをご覧ください。

この情報を使用してクエリを最適化する方法については、クエリの実行を最適化するをご覧ください。

次に、実行ツリーの例を示します。

Execution:
 results returned: 35
 query id: 7e7b37ea1a259d79
 request peak memory usage: 45.56 KiB (46,656 B)
 data bytes read: 24.58 KiB (25,175 B)
 entity row scanned: 265

Billing:
 read units: 7

Tree:
• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", unset)
|  is query result: true
|
|  Execution:
|   records returned: 35
|   latency: 204.87 ms (local 7.64 ms)
|
└── • Compute
    |  $__id___1: _id($__key___2)
    |
    |  Execution:
    |   records returned: 35
    |   latency: 197.23 ms (local 2.04 ms)
    |
    └── • MajorSort
        |  fields: [$v_5 ASC]
        |  output: [$__key___2, $record_1]
        |
        |  Execution:
        |   records returned: 35
        |   latency: 195.20 ms (local 28.42 ms)
        |   peak memory usage: 45.56 KiB (46,656 B)
        |
        └── • Compute
            |  $v_5: offset($v_4, 0L)
            |
            |  Execution:
            |   records returned: 35
            |   latency: 166.78 ms (local 14.84 ms)
            |
            └── • Compute
                |  $v_4: sortPaths(array($date_placed_1), [date_placed ASC])
                |
                |  Execution:
                |   records returned: 35
                |   latency: 151.94 ms (local 5.43 ms)
                |
                └── • TableScan
                       source: **/orders
                       order: STABLE
                       filter: $eq($user_id_1, 1,234)
                       output bindings: {$__key___2=row().__key__, $date_placed_1=row().date_placed, $record_1=row[* - { __create_time__, __update_time__ }](), $user_id_1=row().user_id}
                       output: [$__key___2, $date_placed_1, $record_1]

                       Execution:
                        records returned: 35
                        latency: 146.50 ms
                        data bytes returned: 3.25 KiB (3,325 B)
                        post-filtered rows: 230
                        records scanned: 265
                        data bytes read: 24.58 KiB (25,175 B)

次のステップ