View a markdown version of this page

クエリプラン分析 - Amazon DocumentDB

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

クエリプラン分析

explain plan によるクエリプラン分析は、Amazon DocumentDB クエリのパフォーマンスに関する重要なインサイトを提供します。executionStats を使用したクエリプランは、次のような主要なメトリクスを明らかにします。

  • ステージごとに返されるドキュメント (nReturned)

  • ステージ固有の実行時間 (executionTimeMillisEstimate)

  • 計画生成期間 (planningTimeMillis)

クエリプランの出力を調べることで、デベロッパーは実行パターンを分析し、インデックス使用率を評価し、クエリパイプラインステージ全体で潜在的な最適化の機会を特定できます。

クエリプランを分析するには、次の形式で explain() コマンドを使用できます。

db.runCommand({explain: {query document}, verbosity: "executionStats"}) db.collection.find().explain("executionStats");

オペレーションの例を次に示します。

db.collection.find({ companyname: { '$eq': 'ANYCOMPANY' }, isDeleted: { '$eq': false } }).sort({"createdAt":1}).limit(2).explain("executionStats");

このオペレーションによる出力は、次のようになります。

{ queryPlanner: { plannerVersion: 2, namespace: 'limit_test.test', winningPlan: { stage: 'LIMIT_SKIP', inputStage: { stage: 'SORT', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, indexFilterSet: false, indexFilterApplied: false, executionStats: { executionSuccess: true, executionTimeMillis: '4.186', planningTimeMillis: '3.909', executionStages: { stage: 'LIMIT_SKIP', nReturned: '2', executionTimeMillisEstimate: '0.199', inputStage: { stage: 'SORT', nReturned: '2', executionTimeMillisEstimate: '0.197', sortPattern: { createdAt: 1 }, inputStage: { stage: 'IXSCAN', nReturned: '34', executionTimeMillisEstimate: '0.151', indexName: 'companyname_1_createdAt_1_isDeleted_1', direction: 'forward', indexCond: { '$and': [ { companyname: { '$eq': 'ANYCOMPANY' } }, { isDeleted: { '$eq': false } } ] } } } } }, serverInfo: { host: 'demo-cluster', port: 27017, version: '5.0.0' }, ok: 1, operationTime: Timestamp({ t: 1759915116, i: 1 }) }

以下は、Amazon DocumentDB クエリ実行プランの詳細な分析であり、各コンポーネントとそのパフォーマンス特性を分類したものです。

全体的なタイミング

executionTimeMillis は、計画時間を含むクエリにかかる合計時間を表します。

planningTimeMillis は、クエリにかかる合計計画時間を表します。

実行ステージ

Amazon DocumentDB がクエリの実行に使用するstep-by-stepのプロセスについて説明し、さまざまなオペレーションでデータがどのように流れるかを示します。

"executionStages": { "stage": "[STAGE_NAME]", "nReturned": "[NUMBER_OF_DOCS]", "executionTimeMillisEstimate": "[TIME]", "inputStage": { // Nested stages } }

クエリプランの一般的なステージ

以下は、クエリプランの一般的な実行ステージです。各ステージは executionTimeMillisEstimate (実行時間) および nReturned (ドキュメント数) メトリクスを返し、すべてのステージでクエリパフォーマンスを評価するのに役立ちます。

COLLSCAN (コレクションスキャン)

  • コレクションドキュメント全体をドキュメントごとにスキャンします

  • nReturned: コレクション内の一致するすべてのドキュメントを返します

  • インデックスが利用できない場合に見られる、高価なオペレーションになる可能性があります

IXSCAN (インデックススキャン)

  • インデックスを使用して一致するドキュメントを検索する

  • nReturned: インデックスに基づいて一致するドキュメントのみ

  • 効率的なオペレーション、COLLSCAN よりも優先

SORT

  • 指定されたフィールドに基づいてドキュメントをソートします

  • クエリのソート属性がインデックスの一部でない場合、このステージは明示的に表示されます。

  • nReturned: 入力ドキュメントと同じ番号

  • 大きな結果セットにはメモリを大量に消費します。最適化するには、ソートフィールド名をインデックスに追加します。

LIMIT_SKIP

  • 返されたドキュメントとスキップされたドキュメントの数を制御します。

  • nReturned: LIMIT 値によって制限されます

  • ページ分割または LIMIT オペレーションに使用されます

サブスキャン

  • ネストされたクエリオペレーションを実行します

  • nReturned: サブクエリの結果によって異なります

  • 複数のステージを持つ複雑なクエリで使用されます

executionTimeMillisEstimate が高いステージは最適化の候補として適しています。

注記

executionStats パラメータは現在、更新コマンドと削除コマンドをサポートしていません。

Explain Plan Execution docsExamined について

を使用してクエリを実行するとexplain("executionStats")、Amazon DocumentDB は、クエリ結果を生成するためにスキャンされたドキュメントの数を理解するのに役立つ検査メトリクスを提供します。これらのメトリクスは、非効率的なクエリプランを特定し、パフォーマンスを最適化するのに役立ちます。

注記

Amazon DocumentDB 5.0.1+ および 8.0.0+ でのみ使用できます。

フィールド

フィールド 説明 レベル
totalDocsExamined すべての実行ステージで検査されたドキュメントの合計数。 最上位の executionStats
docsExamined 特定の実行ステージで検査されたドキュメントの数。 ステージレベル

docsExamined フィールドは次のステージに表示されます。

ステージ 説明
COLSCAN コレクションスキャン。コレクション内のすべてのドキュメントが検査されます。
IXSCAN インデックススキャン。インデックス条件に一致するドキュメントのみが検査されます。
FETCH オプティマイザが IXSCAN から別のステージでドキュメントを取得すると、FETCH ステージは docsExamined を報告します。インデックススキャンプランでは、子 IXSCAN ステージは docsExamined を報告しません。$lookup プランでは、FETCH ステージとその子ステージの両方が docsExamined を報告する場合があります。
注記

docsExamined クエリはドキュメントにアクセスせずにインデックスから完全に満たされるため、 は IXONLYSCAN ステージに表示されません。

Explain Plan executionStats 出力で docsExamined を表示する

次の例では、500,000 のドキュメントを含むコレクションを使用し、さまざまなクエリ実行ステージで がどのようにdocsExamined変化するかを示します。

サンプルデータを作成します。

for (let i = 0; i < 500000; i++) { db.coll.insertOne({ number: i, arr: [i, [i+1]], value: "test", bool: i % 2 === 0 }); }

コレクションスキャン (COLLSCAN)

インデックスがない場合、Amazon DocumentDB はフルコレクションスキャンを実行します。

db.coll.find({ "number": { "$lt": 500 } }).explain("executionStats").executionStats

出力:

{ "executionSuccess" : true, "nReturned" : "500", "executionTimeMillis" : "282.055", "planningTimeMillis" : "0.085", "totalDocsExamined" : "500000", "executionStages" : { "stage" : "COLLSCAN", "nReturned" : "500", "executionTimeMillisEstimate" : "281.915", "docsExamined" : "500000", "filter" : { "number" : { "$lt" : 500 } } } }

500,000 件のドキュメントすべてが 500 件の結果を返すように調査されました。数値フィールドにインデックスを作成すると、これが向上します。

インデックススキャン (IXSCAN)

db.coll.createIndex({ number: 1 }); db.coll.find({ "number": { "$lt": 5000 } }).explain("executionStats").executionStats

出力:

{ "executionSuccess" : true, "nReturned" : "5000", "executionTimeMillis" : "3.047", "planningTimeMillis" : "0.296", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "5000", "executionTimeMillisEstimate" : "2.576", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] } } }

インデックスでは、500,000 件のドキュメントのうち 5,000 件のみが調査および取得され、返された数と一致しました。インデックス条件は、クエリに一致しない 495,000 件のドキュメントを除外しました。

残差フィルターを使用したインデックススキャン

db.coll.find({ "number": { "$lt": 5000 }, "arr": { "$gt": 4000 } }).explain("executionStats").executionStats

出力:

{ "executionSuccess" : true, "nReturned" : "999", "executionTimeMillis" : "15.367", "planningTimeMillis" : "0.115", "totalDocsExamined" : "5000", "executionStages" : { "stage" : "IXSCAN", "nReturned" : "999", "executionTimeMillisEstimate" : "15.170", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5000", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5000 } } ] }, "filter" : { "arr" : { "$gt" : 4000 } } } }

インデックス条件は 500,000 件中 5,000 件のドキュメントに一致し、 の残差フィルターは結果を 999 件にarr減らしました。docsExamined 値 5,000 は、インデックス条件の後、残差フィルターが適用される前に調査されたすべてのドキュメントを反映します。

IXSCAN で取得する

db.coll.find({ "$or": [{ "number": { "$lt": 100000 } }, { "number": { "$gt": 400000 } }] }).explain("executionStats").executionStats

出力:

{ "executionSuccess" : true, "nReturned" : "199999", "executionTimeMillis" : "899.801", "planningTimeMillis" : "0.183", "totalDocsExamined" : "199999", "executionStages" : { "stage" : "FETCH", "nReturned" : "199999", "executionTimeMillisEstimate" : "894.141", "docsExamined" : "199999", "inputStage" : { "stage" : "IXOR", "nReturned" : "0", "executionTimeMillisEstimate" : "874.897", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "100000", "executionTimeMillisEstimate" : "462.208", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$lt" : 100000 } } ] } }, { "stage" : "IXSCAN", "nReturned" : "99999", "executionTimeMillisEstimate" : "412.684", "indexName" : "number_1", "indexCond" : { "$and" : [ { "number" : { "$gt" : 400000 } } ] } } ] } } }

Amazon DocumentDB オプティマイザがフェッチステージを使用してドキュメントを取得すると、FETCH ステージは を報告しますdocsExamined。子 IXSCAN ステージは、ドキュメントに直接アクセスせずにインデックスキーのみをスキャンdocsExaminedするため、レポートされません。

集計ルックアップを使用した FETCH

db.coll.explain("executionStats").aggregate([ { $match: { "number": { "$lt": 5 } } }, { $lookup: { from: "coll", pipeline: [{ $match: { "number": { "$lt": 3 } } }], as: "sub" } } ]).executionStats

出力:

{ "executionSuccess" : true, "nReturned" : "5", "executionTimeMillis" : "0.525", "planningTimeMillis" : "0.327", "totalDocsExamined" : "9", "executionStages" : { "stage" : "NESTED_LOOP_LOOKUP", "nReturned" : "5", "executionTimeMillisEstimate" : "0.163", "inputStages" : [ { "stage" : "IXSCAN", "nReturned" : "5", "executionTimeMillisEstimate" : "0.039", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "5", "indexCond" : { "$and" : [ { "number" : { "$lt" : 5 } } ] } }, { "stage" : "FETCH", "nReturned" : "1", "executionTimeMillisEstimate" : "0.009", "docsExamined" : "1", "inputStage" : { "stage" : "AGGREGATE", "nReturned" : "1", "executionTimeMillisEstimate" : "0.044", "inputStage" : { "stage" : "IXSCAN", "nReturned" : "3", "executionTimeMillisEstimate" : "0.013", "indexName" : "number_1", "direction" : "forward", "docsExamined" : "3", "indexCond" : { "$and" : [ { "number" : { "$lt" : 3 } } ] } } } } ] } }

外部 IXSCAN は、数値 < 5 に一致する 5 つのドキュメントを調べました。内部 IXSCAN は、数値 < 3 に一致する 3 つのドキュメントを調べ、FETCH ステージは 1 つの集計結果を調べました。9 totalDocsExaminedの は、すべてのステージの合計です (5 + 3 + 1)。