定義
$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
Considerations
パイプライン
$planCacheStats
は、集計パイプラインの最初のステージである必要があります。
制限事項
$planCacheStats
は、次の場合は許可されません。$planCacheStats
には読み取り保証レベル"local"
が必要です。
アクセス制御
authorization
で実行されているシステムでは、ユーザーはコレクションに対するplanCacheRead
特権を持っている必要があります。
読み込み設定 (read preference)
$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 }
各ドキュメントには、次のようなさまざまなクエリプランと実行に関する統計が含まれています。
フィールド | 説明 | |||||
---|---|---|---|---|---|---|
このキャッシュ エントリを生成した特定のクエリを含むドキュメントすなわち
| ||||||
| エントリがアクティブか非アクティブかを示すブール値。
| |||||
クエリシェイプのハッシュを表す 16進数の string です。 詳細については、 | ||||||
このクエリに関連付けられているプラン キャッシュ エントリを見つけるために使用されるキーのハッシュを表す 16 進数の string です。 プラン キャッシュ キーは、クエリシェイプとそのシェイプで現在使用可能なインデックスの両方の関数です。 詳しくは、以下を参照してください
| ||||||
キャッシュされたプランの詳細。 詳しくは | ||||||
| クエリ プランナーが候補プランを評価する試用期間中にクエリ実行プランによって実行された「ワーク ユニット」の数。 詳しくは、以下を参照してください
| |||||
| エントリの作成時刻。 | |||||
実行統計ドキュメントの配列。 配列には、候補プランごとに のドキュメントが含まれています。 実行統計の詳細については、 | ||||||
| ||||||
| クエリシェイプにインデックス フィルターが存在するかどうかを示すブール値。 | |||||
| プラン キャッシュ エントリの推定サイズをバイト単位で説明する数値。 バージョン 5.0 で追加 MongoDB 5.0、4.4.3、および 4.2.12 以降では、このフィールドは使用できます。 | |||||
プラン キャッシュ情報が返された シャーディングされたクラスターで実行すると、操作は各 シャードレプリカセット内の 1 つのノードからのプランキャッシュエントリ情報を返します。 このメンバーは、シャード フィールドとホスト フィールドによって識別されます。「 読み込み設定 (read preference) 」も参照してください。 バージョン 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' } ]
クエリ ハッシュのキャッシュ エントリの詳細の検索
特定のクエリ ハッシュのプラン キャッシュ情報を返すには、 $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' } ]
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;