explain の結果
項目一覧
クエリプラン とクエリプランの実行統計に関する情報を返すために、MongoDB は以下を提供します。
cursor.explain()
メソッド、およびexplain
コマンド
重要
explain
はプラン キャッシュを無視します。その代わりに、候補プランのセットが生成され、プラン キャッシュをコンサルティングすることなく勝者が選ばれます。さらに、explain
は MongoDB クエリ プランナーが当選プランをキャッシュするのを防ぎます。
注意
このページには最も重要な出力フィールドのみが表示され、内部使用のフィールドについては文書化されていません。出力に記載されているフィールドは変更される場合があります。
出力構造の説明
explain
結果では、クエリプランはステージのツリーとして表示されます。 出力構造は、操作で使用されるクエリ エンジンによって異なる場合があります。 操作には、クラシック クエリ エンジンまたは スロットベースの実行クエリ エンジン を使用できます。
2 つの実行エンジン間で出力構造がどのように異なるかを確認するには、次の例を参照してください。
winningPlan: { stage: <STAGE1>, ... inputStage: { stage: <STAGE2>, ... inputStage: { stage: <STAGE3>, ... } } },
winningPlan: { queryPlan: { stage: <STAGE1>, ... inputStage: { stage: <STAGE2>, ... inputStage: { stage: <STAGE3>, ... } } } slotBasedPlan: { ... } },
各ステージでは、結果のドキュメントまたはインデックス キーが親ノードに渡されます。リーフ ノードはコレクションまたはインデックスにアクセスします。内部ノードは、子ノードから生成されたドキュメントまたはインデックス キーを使用します。ルート ノードは、MongoDB が最終的に結果セットを導き出すステージを表します。
ステージは、操作について説明しています。例は次のとおりです。
COLLSCAN
、コレクションスキャン用IXSCAN
、インデックス キーのスキャン用FETCH
、ドキュメント検索用GROUP
、ドキュメントのグループ化用SHARD_MERGE
シャードからの結果のマージ用SHARDING_FILTER
、シャードから孤立したドキュメントのフィルタリング用
MongoDB 5.1 以降の explain 出力
このセクションで示されているのは、MongoDB 5.1 以降の explain
出力です。MongoDB 5.1 より前のバージョンの explain 出力を確認するには、該当バージョンのドキュメントを参照してください。
queryPlanner
explain.queryPlanner
情報には、クエリオプティマイザによって選択されたプランの詳細が示されます。
これらの例では、MongoDB のクラシック実行エンジンとスロットベースの実行エンジンの出力構造を組み合わせることができます。どちらも典型的という意図はありません。出力が著しく異なる場合があります。
シャーディングされていないコレクションの場合、explain
は次の queryPlanner
情報を返します。
queryPlanner: { namespace: <string>, indexFilterSet: <boolean>, parsedQuery: { ... }, queryHash: <hexadecimal string>, planCacheKey: <hexadecimal string>, maxIndexedOrSolutionsReached: <boolean>, maxIndexedAndSolutionsReached: <boolean>, maxScansToExplodeReached: <boolean>, winningPlan: { stage: <STAGE1>, inputStage: { stage: <string>, ... } }, rejectedPlans: [ <candidate plan1>, ] } }
シャーディングされたコレクションの場合、explain
には shards
フィールドの各アクセスされたシャード向けの主要クエリ プランナーとサーバーに関する情報が含まれます。
{ queryPlanner: { mongosPlannerVersion: <int> winningPlan: { stage: <STAGE1>, shards: [ { shardName: <string>, connectionString: <string>, serverInfo: { ... }, namespace: <string>, indexFilterSet: <boolean>, parsedQuery: { ... }, queryHash: <hexadecimal string>, planCacheKey: <hexadecimal string>, maxIndexedOrSolutionsReached: <boolean>, maxIndexedAndSolutionsReached: <boolean>, maxScansToExplodeReached: <boolean>, winningPlan: { stage: <STAGE1>, inputStage: { stage: <string>, ... } }, rejectedPlans: [ <candidate plan1>, ] } ] } } }
explain.queryPlanner
クエリオプティマイザによるクエリプランの選択に関する情報が含まれています。
explain.queryPlanner.namespace
クエリによってアクセスされるデータベースとコレクションの名前を含む名前空間を指定する文字列です。名前空間の形式は
<database>.<collection>
です。
explain.queryPlanner.indexFilterSet
MongoDB でクエリシェイプにインデックス フィルターが適用されたかどうかを指定するブール値。
explain.queryPlanner.queryHash
クエリシェイプのハッシュを表す 16 進数の文字列で、クエリシェイプのみに依存します。
queryHash
は、同じクエリシェイプでもスロー クエリ(書き込み (write) 操作のクエリフィルターを含む)を識別するのに役立ちます。注意
他のハッシュ関数と同様に、2 つの異なるクエリシェイプで同じハッシュ値が生成される場合があります。ただし、異なるクエリシェイプ間でハッシュ衝突が発生する可能性は低くなります。
queryHash
とplanCacheKey
の詳細については、「queryHash
とplanCacheKey
」を参照してください。
explain.queryPlanner.planCacheKey
クエリに関連付けられたプラン キャッシュ エントリのキーのハッシュです。
explain.queryPlanner.queryHash
と違ってexplain.queryPlanner.planCacheKey
は、クエリシェイプとそのシェイプで現在使用可能なインデックスの両方の関数です。具体的には、クエリシェイプをサポート可能なインデックスが追加または削除された場合、planCacheKey
値は変化しますが、queryHash
の値は変化しません。queryHash
とplanCacheKey
の詳細については、「queryHash
とplanCacheKey
」を参照してください。
explain.queryPlanner.optimizedPipeline
集計パイプライン操作全体が最適化され、クエリプランの実行ステージをツリー形式に体系化して実行されるようになったことを示すブール値。
たとえば、次の集計操作は集計パイプラインを使用するのではなく、クエリプラン実行のツリーで実行できます。
db.example.aggregate([ { $match: { someFlag: true } } ] ) このフィールドは、値が
true
の場合にのみ表示され、集計パイプライン操作を説明する目的でのみ適用されます。値をtrue
に設定すると、パイプラインが最適化されたため、集計ステージ情報は出力に表示されません。
explain.queryPlanner.winningPlan
クエリオプティマイザによって選択されたプランの詳細が記載されたドキュメントです。
explain.queryPlanner.winningPlan.stage
ステージ名を示す文字列。
各ステージは、ステージに固有の情報で構成されます。たとえば、
IXSCAN
ステージには、インデックスの限界と、インデックス スキャンに固有の他のデータが含まれます。ステージに子ステージが 1 つまたは複数ある場合、そのステージにはinputStage
またはinputStages
が含まれます。このフィールドは、操作でクラシック クエリ実行エンジンが使用された場合に表示されます。
explain.queryPlanner.winningPlan.inputStage
子ステージを記述するドキュメントで、ドキュメントまたはインデックス キーを親に提供します。このフィールドは、親ステージに子ステージが 1 つのみという条件を満たす場合に表示されます。
explain.queryPlanner.winningPlan.inputStages
子ステージを説明するドキュメントの配列。 子ステージは、親ステージにドキュメントまたはインデックス キーを提供します。 このフィールドは、親ステージに複数の子ノードがある場合に表示されます。 たとえば、 $or 式やインデックス交差のステージは、複数のソースからの入力を消費します。
このフィールドは、操作でクラシック クエリ実行エンジンが使用された場合に表示されます。
explain.queryPlanner.winningPlan.queryPlan
クエリオプティマイザによって選択されたプランの詳細が記載されたドキュメントです。MongoDB では、プランはステージのツリーとして表示されます。
このドキュメントは、クエリがスロットベースの実行クエリエンジンを使用した場合に表示されます。
バージョン 5.1 で追加。
explain.queryPlanner.winningPlan.queryPlan.stage
ステージ名を示す文字列。
各ステージは、ステージに固有の情報で構成されます。たとえば、
IXSCAN
ステージには、インデックスの限界と、インデックス スキャンに固有の他のデータが含まれます。
explain.queryPlanner.winningPlan.queryPlan.planNodeId
実行プランの各ステージを識別するユニークな整数フィールドで、
explain
結果全体をカバーするすべてのステージに含まれます。バージョン 5.1 で追加。
explain.queryPlanner.winningPlan.queryPlan.inputStage
「
explain.queryPlanner.winningPlan.inputStage
」を参照してください。
executionStats
返されたexplain.executionStats
情報には、当選プランの実行の詳細が表示されます。 結果にexecutionStats
を含めるには、次のいずれかで explain を実行する必要があります。
allPlansExecution の冗長モードです。プラン選択中にキャプチャされた部分的な実行データを含めるには、
allPlansExecution
モードを使用します。
これらの例では、MongoDB のクラシック実行エンジンとスロットベースの実行エンジンの出力構造を組み合わせることができます。どちらも典型的という意図はありません。出力が著しく異なる場合があります。
シャーディングされていないコレクションの場合、explain
は次の executionStats
情報を返します。
executionStats: { executionSuccess: <boolean>, nReturned: <int>, executionTimeMillis: <int>, totalKeysExamined: <int>, totalDocsExamined: <int>, executionStages: { stage: <STAGE1> nReturned: <int>, executionTimeMillisEstimate: <int>, opens: <int>, // Starting in MongoDB 5.1 closes: <int>, // Starting in MongoDB 5.1 works: <int>, advanced: <int>, needTime: <int>, needYield: <int>, saveState: <int>, restoreState: <int>, isEOF: <boolean>, ... inputStage: { stage: <STAGE2>, nReturned: <int>, ... numReads: <int>, // Starting in MongoDB 5.1 ... executionTimeMillisEstimate: <int>, ... inputStage: { ... } } }, allPlansExecution: [ { nReturned: <int>, executionTimeMillisEstimate: <int>, totalKeysExamined: <int>, totalDocsExamined:<int>, executionStages: { stage: <STAGEA>, nReturned: <int>, executionTimeMillisEstimate: <int>, ... inputStage: { stage: <STAGEB>, ... inputStage: { ... } } } }, ... ] }
シャーディングされたコレクションの場合、 explain
にはアクセスされた各シャードの実行統計が含まれます。
executionStats: { nReturned: <int>, executionTimeMillis: <int>, totalKeysExamined: <int>, totalDocsExamined: <int>, executionStages: { stage: <STAGE1> nReturned: <int>, executionTimeMillis: <int>, opens: <int>, // Starting in MongoDB 5.1 closes: <int>, // Starting in MongoDB 5.1 totalKeysExamined: <int>, totalDocsExamined: <int>, totalChildMillis: <NumberLong>, shards: [ { shardName: <string>, executionSuccess: <boolean>, executionStages: { stage: <STAGE2>, nReturned: <int>, executionTimeMillisEstimate: <int>, ... chunkSkips: <int>, inputStage: { stage: <STAGE3>, ... numReads: <int>, // Starting in MongoDB 5.1 ... inputStage: { ... } } } }, ... ] } allPlansExecution: [ { shardName: <string>, allPlans: [ { nReturned: <int>, executionTimeMillisEstimate: <int>, totalKeysExamined: <int>, totalDocsExamined:<int>, executionStages: { stage: <STAGEA>, nReturned: <int>, executionTimeMillisEstimate: <int>, ... inputStage: { stage: <STAGEB>, ... inputStage: { ... } } } }, ... ] }, { shardName: <string>, allPlans: [ ... ] }, ... ] }
explain.executionStats
当選プランの完了したクエリ実行を示す統計が含まれます。書込み (write) 操作の場合、完了したクエリの実行とは、実行される予定の変更を指しますが、変更はデータベースに適用されません。
explain.executionStats.nReturned
当選したクエリプランが返したドキュメントの数。
nReturned
は、MongoDB の以前のバージョンでcursor.explain()
によって返されたn
フィールドに対応しています。
explain.executionStats.executionTimeMillis
クエリプランの選択とクエリの実行に必要な合計時間(ミリ秒)。これには、プラン選択プロセスの試用段階を実行する時間は含まれるが、データをクライアントに送り返すためのネットワーク時間は含まれません。
explain.executionStats.executionTimeMillis
によって報告される時間は、必ずしも実際のクエリ時間を表していません。定常状態の操作中(クエリプランがキャッシュされている場合)、またはcursor.hint()
をcursor.explain()
とともに使用している場合、MongoDB はプラン選択プロセスをバイパスし、実際の時間が短縮されてexplain.executionStats.executionTimeMillis
値が低くなります。
explain.executionStats.totalKeysExamined
スキャンされたインデックスエントリの数。
explain.executionStats.totalKeysExamined
は、MongoDB の以前のバージョンでcursor.explain()
によって返されたnscanned
フィールドに対応しています。
explain.executionStats.totalDocsExamined
クエリの実行中に検査されたドキュメントの数。ドキュメントを検査する一般的なクエリ実行ステージは、
COLLSCAN
とFETCH
です。注意
explain.executionStats.totalDocsExamined
は、返されたドキュメント数ではなく、検査されたドキュメントの合計数を示します。たとえば、ステージではフィルターを適用するためにドキュメントを調べることができます。ドキュメントがフィルターで除外された場合、そのドキュメントは検査済みですが、クエリ結果セットの一部として返されません。クエリの実行中にドキュメントが複数回検査された場合、
explain.executionStats.totalDocsExamined
はそれぞれの検査でカウントします。 つまり、explain.executionStats.totalDocsExamined
は検査された一意のドキュメントの合計数ではありません。
explain.executionStats.executionStages
当選プランの実行が完了したことをステージのツリーとして表示します。つまり、1 つのステージに 1 つの
inputStage
または複数のinputStages
があってもかまいません。MongoDB 5.1 以降では、次の入力ステージをステージに含めることができます。
thenStage
elseStage
innerStage
outerStage
各ステージは、ステージに固有の実行情報で構成されます。
explain.executionStats.executionStages.works
クエリ実行ステージで実行される「ワーク ユニット」の数を指定します。クエリの実行では、作業が小さな単位に分割されます。「ワークユニット」には、1 つのインデックス キーの調査、コレクションから 1 つのドキュメントの取り出し、1 つのドキュメントにプロジェクションを適用、あるいは、内部ブックキーピングの実行で構成される場合があります。
このフィールドは、操作でクラシック クエリ実行エンジンが使用された場合に表示されます。
explain.executionStats.executionStages.restoreState
クエリ ステージが保存された実行状態を復元した回数です。たとえば、以前に生成したロックをリカバリした後です。
explain.executionStats.executionStages.isEOF
実行ステージがストリームの終わりに達したかどうかを次のとおり指定します。
true
または1
の場合、実行ステージはストリームの終端に達しています。false
または0
の場合、ステージにまだ返される結果がある可能性があります。たとえば、制限のあるクエリで、実行ステージを構成するLIMIT
ステージに、IXSCAN
とクエリ用に入力するステージがあるものを考えてみましょう。このクエリから指定した制限を超える値が返される場合、LIMIT
ステージではisEOF: 1
と報告されますが、その基礎となるIXSCAN
ステージではisEOF: 0
と報告されます。
explain.executionStats.executionStages.inputStage
各
inputStage
のフィールドは、inputStage.stage
の値に応じて異なる可能性があります。次の表では、使用可能なフィールドとフィールドが表示される可能性のあるステージについて説明しています。各
inputStage
には、別のinputStage
をフィールドとして含めることができます。 出力構造の説明 を参照してください。フィールド説明適用可能なステージdocsExamined
クエリ実行ステージでスキャンされるドキュメントの数を指定します。
COLLSCAN
,FETCH
keysExamined
インデックスをスキャンするクエリ実行ステージの場合、
keysExamined
はインデックス スキャンのプロセスで検査される限界内のキーと限界外のキーの総数。インデックス スキャンが 1 つの連続したキー範囲で構成されている場合は、範囲内のキーのみを調べる必要があります。インデックスの限界が複数のキー範囲で構成されている場合、インデックス スキャンの実行プロセスでは、ある範囲の終わりから次の範囲の先頭にスキップするために、範囲外のキーを調べることがあります。IXSCAN
numReads
クエリ実行段階でスキャンされたドキュメントの数、または検査されたインデックス キーの数。
バージョン 5.1 で追加。
COLLSCAN
,IXSCAN
seeks
インデックス カーソルがインデックス スキャンを完了するための新しい位置を探すのに必要だった回数。
IXSCAN
spilledBytesApprox
ステージ内でディスクにスピルしたインメモリのバイト数の概算。
バージョン 5.3 で追加。
GROUP
spilledRecords
ステージ内でディスクにスピルした、生成されたレコードの数。
バージョン 5.3 で追加。
GROUP
usedDisk
ステージでディスクに書込み (write) されたかどうか。
バージョン 5.3 で追加。
GROUP
explain.executionStats.allPlansExecution
当選したプランと拒否されたプランの両方について、プラン選択フェーズ中にキャプチャされた部分的な実行情報が含まれます。このフィールドは、
explain
がallPlansExecution
冗長モードで実行されている場合にのみ存在します。
serverInfo
シャーディングされていないコレクションの場合、explain
は MongoDB インスタンスの次の serverInfo
情報を返します。
serverInfo: { host: <string>, port: <int>, version: <string>, gitVersion: <string> }
シャーディングされたコレクションの場合、 explain
はアクセスしたシャードごとにserverInfo
を返し、 mongos
の最上位のserverInfo
オブジェクトを返します
queryPlanner: { ... winningPlan: { stage: <STAGE1>, shards: [ { shardName: <string>, connectionString: <string>, serverInfo: { host: <string>, port: <int>, version: <string>, gitVersion: <string> }, ... } ... ] } }, serverInfo: { // serverInfo for mongos host: <string>, port: <int>, version: <string>, gitVersion: <string> } ...
パイプライン ステージを使用するクエリの実行プラン統計$lookup
バージョン 5.0 で追加
explain の結果には、$lookup
のパイプライン ステージを使用するクエリの実行統計を含めることができます。これらの実行統計を含めるには、以下のいずれかの実行冗長モードで説明操作を実行する必要があります。
$lookup
クエリの explain の結果には次のフィールドが含まれます。
'$lookup': { from: <string>, as: <string>, localField: <string>, foreignField: <string> }, totalDocsExamined: <long>, totalKeysExamined: <long>, collectionScans: <long>, indexesUsed: [ <string_1>, <string_2>, ..., <string_n> ], executionTimeMillisEstimate: <long>
$lookup
セクションのフィールドの説明については、$lookup
ページを参照してください。
その他のフィールドは次のとおりです。
コレクションスキャン
クエリ プランナーがコレクションスキャンを選択した場合、explain の結果には COLLSCAN
ステージが含まれます。
クエリ プランナーによってインデックスが選択された場合、explain の結果には IXSCAN
ステージが加わります。このステージでは、インデックス キーのパターン、トラバースの方向、インデックスの限界などの情報が提供されます。
MongoDB 5.3 以降では、クエリ プランナーでクラスター化されたコレクションにクラスター化されたインデックスが選択され、かつ検索するインデックス部分を定義する限界がクエリに含まれている場合、explain の結果には CLUSTERED_IXSCAN
ステージが加わります。このステージでは、クラスター化されたインデックスキーとインデックスの限界に関する情報が提供されます。
クエリ プランナーによってクラスター化されたコレクションにクラスター化されたインデックスが選択され、かつクエリに限界が含まれていない場合、クエリでは、限界抜きでコレクションのスキャンが実行され、explain の結果には COLLSCAN
ステージが加わります。
注意
限界が設定されていないクエリで、クラスター化インデックスを使用するものは、コレクションのフル スキャンが必要なため、notablescan
パラメーターでは許可されません。
コレクションスキャンの実行統計の詳細については、「クエリ パフォーマンスの分析 」を参照してください。
カバード クエリ
インデックスがクエリをカバーする場合、MongoDB ではクエリの条件を一致させること、およびインデックスキーのみを使用して結果を返すこともできます。MongoDBでは、クエリの一部を実行するためにコレクションのドキュメントを検査する必要はありません。
インデックスがクエリを補う場合、explain の結果には FETCH
ステージの子孫ではない、IXSCAN
ステージがあり、executionStats
では explain.executionStats.totalDocsExamined
は 0
です。
インデックスの交差
インデックス交差プランの場合、結果にはインデックスの詳細を示すexplain.queryPlanner.winningPlan.inputStages
配列を持つAND_SORTED
ステージまたはAND_HASH
ステージのいずれかが含まれます。例:
{ stage : 'AND_SORTED', inputStages : [ { stage : 'IXSCAN', ... }, { stage : 'IXSCAN', ... } ] }
$or
式
MongoDB が $or
式にインデックスを使用する場合、結果にはインデックスの詳細を示す explain.queryPlanner.winningPlan.inputStages
配列を含む、OR
ステージが含まれます。以下がその例です。
{ stage: 'OR', inputStages: [ { stage: 'IXSCAN', ... }, { stage : 'IXSCAN', ... }, ... ] }
MongoDB の以前のバージョンでは、cursor.explain()
インデックスの詳細を示す clauses
配列を返していました。
$sort
ステージと$group
ステージ
explain
が、executionStats または allPlansExecution 冗長モードのいずれかで実行されると、$sort
および $group
ステージに追加の出力があります。
ソート ステージ
MongoDB では、1 つまたは複数のインデックスを使用してソート順序を取得できない場合、結果にはブロッキングソート操作を指し示す SORT
ステージが含まれます。ブロッキングソートは、コレクションまたはデータベースに対する同時操作をブロックしません。この名前は、SORT
ステージが出力ドキュメントを返す前にすべての入力ドキュメントを読み取り、その特定のクエリのデータフローをブロックするという要件に由来しています。
MongoDB がブロッキングソート操作に 100 メガバイトを超えるシステム メモリを必要とする場合、クエリが cursor.allowDiskUse()
を指定しない限り、MongoDB はエラーを返します。cursor.allowDiskUse()
では、ブロッキングソート操作の処理中に、MongoDB がディスク上の一時ファイルを使用して、100 メガバイトのシステムメモリ制限を超えるデータを保存できるようにします。explain プランに明示的な SORT
ステージが含まれていない場合には、MongoDB はインデックスを使用して並べ替え順を取得できます。