Query Explain を使用してクエリ実行を分析する
このページでは、クエリの実行時にクエリ実行情報を取得する方法について説明します。
クエリ Explain を使用する
Query Explain を使用すると、クエリの実行方法を把握できます。 これにより、クエリを最適化するために使用できる詳細情報が提供されます。
Query Explain は、 Google Cloud コンソールまたは explain コマンドを使用して確認できます。
コンソール
クエリエディタでクエリを実行し、[説明] タブを開きます。
-
Google Cloud コンソールで、[データベース] ページに移動します。
- データベースのリストから、MongoDB 互換の Firestore データベースを選択します。 Google Cloud コンソールで、そのデータベースの Firestore エクスプローラが開きます。
- クエリエディタにクエリを入力し、[実行] をクリックします。
-
[説明] タブをクリックして、クエリ分析の出力を表示します。
MongoDB API
MongoDB API の Query Explain は、Mongo Shell や Compass などのツールで使用できる explain コマンドでサポートされています。
explain コマンドは、aggregate、find、distinct、count コマンドでサポートされています。次に例を示します。
db.collection.explain('executionStats').find(...)
explain() メソッドを使用することもできます。次に例を示します。
db.collection.find({QUERY}).explain('executionStats')制限事項
次の制限事項と相違点に注意してください。-
Query Explain は、カーソルを返すコマンドをサポートしていません。たとえば、次のコマンドを直接呼び出して Explain を呼び出すことはサポートされていません。
db.collection.aggregate(..., explain: true)
Query Explain は、
find、aggregate、count、distinct、update、delete、findAndModifyコマンドでのみサポートされています。-
Query Explain は、
executionStats、allPlansExecution、queryPlannerの詳細モードをサポートしています。queryPlanner: クエリを実行せずに実行プランのみを返します。executionStatsとallPlansExecution: 実行プランと、課金、メモリ、実行の統計情報を返します。
詳細モードが指定されていない場合、シェルはデフォルトで
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)
次のステップ
- 実行ツリーのノードについては、クエリ実行のリファレンスをご覧ください。
- クエリを最適化する方法については、クエリの実行を最適化するをご覧ください。