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

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

クエリ Explain を使用する

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

クエリの説明は、 Google Cloud コンソールまたは explain コマンドを使用して確認できます。

コンソール

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

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

    [データベース] に移動

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

    コンソールの [クエリの説明] タブ
Mongo API

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

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

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

explain() メソッドを使用することもできます。

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

    db.collection.aggregate(..., explain: true)
  • クエリの説明は、findaggregatecountdistinct コマンドでのみサポートされています。

  • MongoDB API では、Query Explain の Verbosity オプションと Comment オプションはサポートされていません。この動作は executionStats オプションと一致します。allPlansExecution オプションと queryPlanner オプションは、指定されても無視されます。

分析

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

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

実行ツリー

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

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

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

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

• Drop
|  fields to drop: [__$3__]
|  records returned: 0
|
└── • MajorSort
    |  fields: [__$3__ ASC]
    |  peak memory usage: 4.00 KiB (4,096 B)
    |  records returned: 0
    |
    └── • Extend
        |  expressions: [date_placed AS __$3__]
        |  records returned: 0
        |
        └── • Drop
            |  fields to drop: [__key__]
            |  records returned: 0
            |
            └── • Extend
                |  expressions: [_id(__key__) AS __id__]
                |  records returned: 0
                |
                └── • Filter
                    |  expression: $eq(user, 1,234)
                    |  records returned: 0
                    |
                    └── • TableScan
                           order: UNDEFINED
                           properties: * - { __create_time__, __update_time__ }
                           records returned: 0
                           records scanned: 0
                           source: (default)#/**/collection

次のステップ