Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/
データベース マニュアル
/ / /

$planCacheStats

$planCacheStats

バージョン 4.2の新機能

コレクションのプラン キャッシュ情報を返します。 ステージでは、プラン キャッシュのエントリごとにドキュメントが返されます。

$planCacheStatsステージはパイプラインの最初のステージである必要があります。 ステージは空のドキュメントをパラメーターとして受け取り、次の構文を使用します。

{ $planCacheStats: { } }

注意

4.4 の変更

バージョン 4.4 以降、

  • $planCacheStatsステージはmongosインスタンスとmongodインスタンスでも実行できます。 4の 。 2 、 $planCacheStatsステージはmongodインスタンスでのみ実行できます。

  • $planCacheStatsには新しいフィールドが含まれます。ホストフィールドと、 mongosに対して実行した場合は、シャードフィールドが含まれます。

  • mongo shell は、PlanCache.list() 集計ステージのラッパーとしてメソッド$planCacheStats を提供します。

  • MongoDB は以下を削除します。

    • planCacheListPlans およびplanCacheListQueryShapesコマンドと

    • PlanCache.getPlansByQuery() およびPlanCache.listQueryShapes()メソッド。

    代わりに$planCacheStatsまたはPlanCache.list()を使用してください。

Tip

$planCacheStats は、集計パイプラインの最初のステージである必要があります。

authorizationで実行されているシステムでは、ユーザーはコレクションに対するplanCacheRead特権を持っている必要があります。

$planCacheStatsは、プラン キャッシュ情報を返すホストを選択する際の読み込み設定( read preference )を観察します。

アプリケーションは、レプリカセットの異なるノードを対象とする場合があります。 そのため、各レプリカセット ノードは異なる読み取りコマンドを受け取り、他のノードとは異なるプラン キャッシュ情報を持っている可能性があります。 ただし、レプリカセットまたはシャーディングされたクラスターで$planCacheStatsを実行すると、通常の読み込み設定(read preference)ルールに従います。 つまり、レプリカセットでは、この操作はレプリカセットの 1 つのメンバーのみからプラン キャッシュ情報を収集し、シャーディングされたクラスターでは、この操作は各シャード レプリカセットの 1 つのメンバーのみからプラン キャッシュ情報を収集します。

各プラン キャッシュ エントリごとに、 $planCacheStatsステージは次のようなドキュメントを返します。

{
"createdFromQuery" : <document>,
"queryHash" : <hexadecimal string>,
"planCacheKey" : <hexadecimal string>,
"isActive" : <boolean>,
"works" : <NumberLong>,
"cachedPlan" : {
"stage" : <STAGE1>,
"filter" : <document>,
"inputStage" : {
"stage" : <STAGE2>,
...
}
},
"timeOfCreation" : <date>,
"creationExecStats" : [ // Exec Stats Document for each candidate plan
{
"nReturned" : <num>,
"executionTimeMillisEstimate" : <num>
"totalKeysExamined" : <num>
"totalDocsExamined" :<num>
"executionStages" : {
"stage" : <STAGE A>,
...
"inputStage" : {
"stage" : <STAGE B>,
...
}
}
},
...
],
"candidatePlanScores" : [
<number>,
...
],
"indexFilterSet" : <boolean>,
"estimatedSizeBytes" : <num>, // Available starting in MongoDB 5.0, 4.4.3, 4.2.12
"host" : <string>, // Available starting in MongoDB 4.4
"shard" : <string> // Available starting in MongoDB 4.4 if run on sharded cluster
}

各ドキュメントには、次のようなさまざまなクエリプランと実行に関する統計が含まれています。

フィールド
説明

このキャッシュ エントリを生成した特定のクエリを含むドキュメントすなわち

{
"query" : <document>,
"sort" : <document>,
"projection" : <document>
}

isActive

エントリがアクティブか非アクティブかを示すブール値。

  • アクティブな場合、クエリ プランナーは現在 エントリを使用してクエリプランを生成しています。

  • 非アクティブの場合、クエリ プランナーは現在、クエリプランを生成するためにエントリを使用していません。

クエリシェイプのハッシュを表す 16進数の string です。 詳細については、 explain.queryPlanner.queryHashを参照してください

このクエリに関連付けられているプラン キャッシュ エントリを見つけるために使用されるキーのハッシュを表す 16 進数の string です。 プラン キャッシュ キーは、クエリシェイプとそのシェイプで現在使用可能なインデックスの両方の関数です。 詳しくは、以下を参照してください explain.queryPlanner.planCacheKey

キャッシュされたプランの詳細。 詳しくはexplain.queryPlannerを参照してください。

works

クエリ プランナーが候補プランを評価する試用期間中にクエリ実行プランによって実行された「ワーク ユニット」の数。 詳しくは、以下を参照してください explain.executionStats.executionStages.works

timeOfCreation

エントリの作成時刻。

実行統計ドキュメントの配列。 配列には、候補プランごとに のドキュメントが含まれています。

実行統計の詳細については、 explain.executionStatsを参照してください。

creationExecStats配列にリストされている候補プランのスコアの配列。

indexFilterSet

クエリシェイプにインデックス フィルターが存在するかどうかを示すブール値。

estimatedSizeBytes

プラン キャッシュ エントリの推定サイズをバイト単位で説明する数値。

バージョン 5.0 で追加

MongoDB 5.0、4.4.3、および 4.2.12 以降では、このフィールドは使用できます。

プラン キャッシュ情報が返されたmongodインスタンスのホスト名とポート。

シャーディングされたクラスターで実行すると、操作は各 シャードレプリカセット内の 1 つのノードからのプランキャッシュエントリ情報を返します。 このメンバーは、シャード フィールドとホスト フィールドによって識別されます。「 読み込み設定 (read preference) 」も参照してください。

バージョン 4.4 で追加

$planCacheStatsがキャッシュエントリを取得したシャードの名前。

シャーディングされたクラスターで実行した場合にのみ使用できます。

バージョン 4.4 で追加

このセクションの例では、次の orders コレクションを使用します。

db.orders.insertMany( [
{ "_id" : 1, "item" : "abc", "price" : Decimal128("12"), "quantity" : 2, "type": "apparel" },
{ "_id" : 2, "item" : "jkl", "price" : Decimal128("20"), "quantity" : 1, "type": "electronics" },
{ "_id" : 3, "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type": "apparel" },
{ "_id" : 4, "item" : "abc", "price" : Decimal128("8"), "quantity" : 10, "type": "apparel" },
{ "_id" : 5, "item" : "jkl", "price" : Decimal128("15"), "quantity" : 15, "type": "electronics" }
] )

コレクションに次のインデックスを作成します。

db.orders.createIndex( { item: 1 } );
db.orders.createIndex( { item: 1, quantity: 1 } );
db.orders.createIndex( { quantity: 1 } );
db.orders.createIndex( { quantity: 1, type: 1 } );
db.orders.createIndex(
{ item: 1, price: 1 },
{ partialFilterExpression: { price: { $gte: Decimal128("10")} } }
);

注意

インデックス{ item: 1, price: 1 }部分インデックスであり、 priceフィールドがDecimal128("10")以上のドキュメントのみをインデックス化します。

コレクションに対していくつかのクエリを実行します。

db.orders.find( { item: "abc", price: { $gte: Decimal128("10") } } )
db.orders.find( { item: "abc", price: { $gte: Decimal128("5") } } )
db.orders.find( { quantity: { $gte: 20 } } )
db.orders.find( { quantity: { $gte: 5 }, type: "apparel" } )

上記のクエリは、スロットベースのクエリ実行エンジンを使用して完了されます。

次の集計パイプラインは$planCacheStats を使用して、コレクションのプランキャッシュエントリに関する情報を返します。

db.orders.aggregate( [
{ $planCacheStats: { } }
] )

出力:

[
{ // Plan Cache Entry 1
version: '2',
planCacheShapeHash: '478AD696',
planCacheKey: '21AE23AD',
isActive: true,
works: Long("7"),
timeOfCreation: ISODate("2023-05-22T20:33:49.031Z"),
cachedPlan: {
...
},
indexFilterSet: false,
isPinned: false,
estimatedSizeBytes: Long("8194"),
host: 'mongodb1.example.net:27018'
},
{ // Plan Cache Entry 2
version: '2',
planCacheShapeHash: '3D8AFDC6',
planCacheKey: '1C2C4360',
isActive: true,
works: Long("6"),
timeOfCreation: ISODate("2023-05-22T20:33:50.584Z"),
cachedPlan: {
...
},
indexFilterSet: false,
isPinned: false,
estimatedSizeBytes: Long("11547"),
host: 'mongodb1.example.net:27018'
},
{ // Plan Cache Entry 3
version: '2',
planCacheShapeHash: '27285F9B',
planCacheKey: '20BB9404',
isActive: true,
works: Long("1"),
timeOfCreation: ISODate("2023-05-22T20:33:49.051Z"),
cachedPlan: {
...
},
indexFilterSet: false,
isPinned: false,
estimatedSizeBytes: Long("7406"),
host: 'mongodb1.example.net:27018'
},
{ // Plan Cache Entry 4
version: '2',
planCacheShapeHash: '478AD696',
planCacheKey: 'B1435201',
isActive: true,
works: Long("5"),
timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),
cachedPlan: {
...
},
indexFilterSet: false,
isPinned: false,
estimatedSizeBytes: Long("7415"),
host: 'mongodb1.example.net:27018'
}
]

planCacheKey も参照してください。

特定のクエリ ハッシュのプラン キャッシュ情報を返すには、 $planCacheStatsステージの後にplanCacheKeyフィールドの$matchが続くようにします。

次の集計パイプラインでは、 $planCacheStatsとそれに続く$matchステージを使用して、特定のクエリ ハッシュの特定の情報を返しています。

db.orders.aggregate( [
{ $planCacheStats: { } },
{ $match: { planCacheKey: "B1435201"} }
] )

出力:

[
{
version: '2',
planCacheShapeHash: '478AD696',
planCacheKey: 'B1435201',
isActive: true,
works: Long("5"),
timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),
cachedPlan: {
slots: '$$RESULT=s11 env: { s3 = 1684787629009 (NOW), s6 = Nothing, s5 = Nothing, s1 = TimeZoneDatabase(Asia/Kuwait...Etc/UCT) (timeZoneDB), s10 = {"item" : 1, "price" : 1}, s2 = Nothing (SEARCH_META) }',
stages: '[2] nlj inner [] [s4, s7, s8, s9, s10] \n' +
' left \n' +
' [1] cfilter {(exists(s5) && exists(s6))} \n' +
' [1] ixseek s5 s6 s9 s4 s7 s8 [] @"358822b7-c129-47b7-ad7f-40017a51b03c" @"item_1_price_1" true \n' +
' right \n' +
' [2] limit 1 \n' +
' [2] seek s4 s11 s12 s7 s8 s9 s10 none none [] @"358822b7-c129-47b7-ad7f-40017a51b03c" true false \n'
},
indexFilterSet: false,
isPinned: false,
estimatedSizeBytes: Long("7415"),
host: 'mongodb1.example.net:27018'
}
]

planCacheKeyqueryHashも参照してください。

MongoDB Node.jsドライバーを使用して $planCacheStats ステージを集計パイプラインに追加するには、パイプラインオブジェクトで $planCacheStats 演算子を使用します。

次の例では、コレクションのプランキャッシュエントリに関する情報を返すパイプラインステージを作成しています。次に、この例では集計パイプラインを実行します。

const pipeline = [{ $planCacheStats: {} }];
const cursor = collection.aggregate(pipeline);
return cursor;

特定のクエリ ハッシュのプランキャッシュ情報を返すには、planCacheKeyフィールドに特定のクエリ ハッシュをチェックする $match ステージを含めます。

次の例では、クエリ ハッシュ値が "B1435201" の情報を返すパイプラインを作成しています。次に、この例では集計パイプラインを実行します。

const pipeline = [
$planCacheStats: {} },
{ $match: { planCacheKey: "B1435201"} }
];
const cursor = collection.aggregate(pipeline);
return cursor;

戻る

$out

項目一覧