PlanCache.list()
定義
PlanCache.list(<pipeline>)
コレクションのプラン キャッシュエントリの配列を返します。
メソッドは、特定のコレクションの
plan cache object
からのみ使用できます。すなわちdb.collection.getPlanCache().list(<pipeline>) Parameterタイプ説明配列任意。 プランキャッシュクエリシェイプ をフィルタリング/処理するための 集計パイプライン 。
このメソッドは、
mongod
またはmongos
インスタンスから実行できます。 シャーディングされたクラスターで実行すると、メソッドは各シャード レプリカセット内の 1 つのノードからのプラン キャッシュ エントリ情報を返します。 このメンバーは、シャードフィールドとホストフィールドによって識別されます。 「読み込み設定 (read preference) 」も参照してください。メソッド
PlanCache.list()
は$planCacheStats
集計パイプラインをラップします。 つまり、db.collection.getPlanCache().list([<stage1>, <stage2>, ...] ) は次と同等です:
db.collection.aggregate([ <$planCacheStats stage>, <stage1>, <stage2>, ... ]).toArray(); 出力の詳細については、 $planCacheStats 出力 を参照してください。
すべてのクエリがキャッシュにクエリプランを自動的に配置するわけではありません。 キャッシュされたクエリプランを持つプランキャッシュクエリシェイプが現在存在しない場合は、
PlanCache.list()
は空の配列を返します。
検討事項
クエリ設定
MongoDB 8.0以降では、インデックス フィルターを追加する 代わりに、 クエリ設定を使用します 。 インデックス フィルターは MongoDB 8.0以降非推奨です。
クエリ設定は、インデックス フィルターよりも多くの機能を持ちます。 また、インデックス フィルターは永続的ではなく、すべてのクラスター ノードに対してインデックス フィルターを簡単に作成することはできません。 クエリ設定を追加して例を探すには、 setQuerySettings
を参照してください。
制限事項
クエリハッシュとプラン キャッシュのクエリシェイプ
同じプランキャッシュクエリシェイプを持つ低速クエリを識別できるように、各プランキャッシュクエリシェイプはクエリ ハッシュに関連付けられています。 プランキャッシュクエリシェイプハッシュは、クエリシェイプのハッシュを表す 16 進数のstringであり、クエリシェイプのみに依存しクエリシェイプ。
注意
他のハッシュ関数と同様に、2 つの異なるクエリシェイプで同じハッシュ値が生成される場合があります。ただし、異なるクエリシェイプ間でハッシュ衝突が発生する可能性は低くなります。
MongoDB 8.0以降、既存のqueryHash
フィールドの名前がplanCacheShapeHash
に変更されます。 以前のバージョンの MongoDB を使用している場合は、 planCacheShapeHash
ではなくqueryHash
が表示されます。
クエリオプティマイザは、実行可能なプランが複数ある可能性のあるプランキャッシュクエリシェイプのプランのみをキャッシュします。
プラン キャッシュ内の各エントリはplanCacheShapeHash
に関連付けられています。
警告
MongoDB 8.0以降、既存のqueryHash
フィールドの名前がplanCacheShapeHash
に変更されます。 以前のバージョンの MongoDB を使用している場合は、 planCacheShapeHash
ではなくqueryHash
が表示されます。
読み込み設定 (read preference)
PlanCache.list()
は、プラン キャッシュ情報を返すホストを選択する際の読み込み設定( read preference )を観察します。
アプリケーションは、レプリカセットの異なるノードを対象とする場合があります。 そのため、各レプリカセット ノードは異なる読み取りコマンドを受け取り、他のノードとは異なるプラン キャッシュ情報を持っている可能性があります。 ただし、レプリカセットまたはシャーディングされたクラスターでPlanCache.list()
を実行すると、通常の読み込み設定(read preference)ルールに従います。 つまり、レプリカセットでは、この操作はレプリカセットの 1 つのメンバーのみからプラン キャッシュ情報を収集し、シャーディングされたクラスターでは、この操作は各シャード レプリカセットの 1 つのメンバーのみからプラン キャッシュ情報を収集します。
必要なアクセス権
authorization
で実行されているシステムでは、ユーザーはコレクションに対するplanCacheRead
特権を持っている必要があります。
例
注意
すべてのクエリがクエリプランをキャッシュに自動的に配置するわけではありません。 キャッシュされたクエリプランを持つクエリシェイプが現在存在しない場合、
PlanCache.list()
は空の配列を返します。出力の詳細については、 $planCacheStats 出力 を参照してください。
このセクションの例では、次の orders
コレクションを使用します。
db.orders.insertMany( [ { "_id" : 1, "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type": "apparel" }, { "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type": "electronics" }, { "_id" : 3, "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type": "apparel" }, { "_id" : 4, "item" : "abc", "price" : NumberDecimal("8"), "quantity" : 10, "type": "apparel" }, { "_id" : 5, "item" : "jkl", "price" : NumberDecimal("15"), "quantity" : 15, "type": "electronics" } ] )
コレクションに次のインデックスを作成します。
db.orders.createIndex( { item: 1 } ); db.orders.createIndex( { item: 1, quantity: 1 } ); db.orders.createIndex( { item: 1, price: 1 }, { partialFilterExpression: { price: { $gte: NumberDecimal("10")} } } ); db.orders.createIndex( { quantity: 1 } ); db.orders.createIndex( { quantity: 1, type: 1 } );
注意
インデックス{ item: 1, price: 1 }
は部分インデックスであり、 price
フィールドがNumberDecimal("10")
以上のドキュメントのみをインデックス化します。
コレクションに対していくつかのクエリを実行します。
db.orders.find( { item: "abc", price: { $gte: NumberDecimal("10") } } ) db.orders.find( { item: "abc", price: { $gte: NumberDecimal("5") } } ) db.orders.find( { quantity: { $gte: 20 } } ) db.orders.find( { quantity: { $gte: 5 }, type: "apparel" } )
クエリ キャッシュ内のすべてのエントリの情報を返す
次の例では、 orders
コレクションのプランがキャッシュされたプランキャッシュクエリシェイプが返されます。
db.orders.getPlanCache().list()
メソッドは、現在キャッシュにあるプランキャッシュクエリシェイプの配列を返します。 の例では、 orders
コレクションには次の形状に関連付けられたクエリプランがキャッシュされていました。
[ { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 5 }, "type" : "apparel" }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "4D151C4C", "planCacheKey" : "DD67E353", "isActive" : false, "works" : NumberLong(4), "cachedPlan" : { "stage" : "FETCH", "filter" : { "type" : { "$eq" : "apparel" } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "quantity" : 1 }, "indexName" : "quantity_1", "isMultiKey" : false, "multiKeyPaths" : { "quantity" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "quantity" : [ "[5.0, inf.0]" ] } } }, "timeOfCreation" : ISODate("2020-02-06T15:57:18.219Z"), "creationExecStats" : [ { "nReturned" : 2, "executionTimeMillisEstimate" : 0, "totalKeysExamined" : 3, "totalDocsExamined" : 3, "executionStages" : { "stage" : "FETCH", "filter" : { "type" : { "$eq" : "apparel" } }, "nReturned" : 2, "executionTimeMillisEstimate" : 0, "works" : 4, ... } }, { "nReturned" : 2, "executionTimeMillisEstimate" : 0, "totalKeysExamined" : 3, "totalDocsExamined" : 2, "executionStages" : { "stage" : "FETCH", "nReturned" : 2, "executionTimeMillisEstimate" : 0, "works" : 4, ... } } ], "candidatePlanScores" : [ 1.5002, 1.5002 ], "indexFilterSet" : false, "estimatedSizeBytes" : NumberLong(3160), // Available starting in MongoDB 5.0 "host" : "mongodb1.example.net:27018", "shard" : "shardA" // Available if run on sharded cluster }, { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 20 } }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "23B19B75", "planCacheKey" : "6F23F858", "isActive" : false, "works" : NumberLong(1), ... }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("5") } }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "117A6B10", "planCacheKey" : "A1824628", "isActive" : false, "works" : NumberLong(4), ... }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("10") } }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "117A6B10", "planCacheKey" : "2E6E536B", "isActive" : false, "works" : NumberLong(3), ... } ]
警告
MongoDB 8.0以降、既存のqueryHash
フィールドの名前がplanCacheShapeHash
に変更されます。 以前のバージョンの MongoDB を使用している場合は、 planCacheShapeHash
ではなくqueryHash
が表示されます。
出力の詳細については、 $planCacheStats 出力 を参照してください。
プラン キャッシュ クエリシェイプの一覧表示
キャッシュされたプランがあるすべてのクエリシェイプのリストを取得するには、 PlanCache.list()
を使用できます。 例、次の操作は ステージを持つパイプラインを渡し、$project
createdFrom クエリフィールドと planCacheShapeHash フィールドのみを出力します。
db.orders.getPlanCache().list( [ { $project: {createdFromQuery: 1, planCacheShapeHash: 1 } } ] )
警告
MongoDB 8.0以降、既存のqueryHash
フィールドの名前がplanCacheShapeHash
に変更されます。 以前のバージョンの MongoDB を使用している場合は、 planCacheShapeHash
ではなくqueryHash
が表示されます。
この操作では、次のプランキャッシュクエリシェイプが返されます。
[ { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 5 }, "type" : "apparel" }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "4D151C4C" }, { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 20 } }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "23B19B75" }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("5") } }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "117A6B10" }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("10") } }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "117A6B10" } ]
出力の詳細については、 $planCacheStats 出力 を参照してください。
プラン キャッシュ クエリシェイプのキャッシュ エントリの詳細の検索
特定のクエリシェイプのプラン キャッシュ情報を返すには、$match
planCacheKey フィールドに指定したパイプラインを渡します。
db.orders.getPlanCache().list([ { $match: { planCacheKey: "DD67E353"} } ] )
この操作では、以下を返します。
[ { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 5 }, "type" : "apparel" }, "sort" : { }, "projection" : { } }, "planCacheShapeHash" : "4D151C4C", "planCacheKey" : "DD67E353", "isActive" : false, "works" : NumberLong(4), "cachedPlan" : { "stage" : "FETCH", "filter" : { "type" : { "$eq" : "apparel" } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "quantity" : 1 }, "indexName" : "quantity_1", "isMultiKey" : false, "multiKeyPaths" : { "quantity" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "quantity" : [ "[5.0, inf.0]" ] } } }, "timeOfCreation" : ISODate("2020-02-11T17:14:33.873Z"), "creationExecStats" : [ { "nReturned" : 2, "executionTimeMillisEstimate" : 0, "totalKeysExamined" : 3, "totalDocsExamined" : 3, "executionStages" : { "stage" : "FETCH", "filter" : { "type" : { "$eq" : "apparel" } }, "nReturned" : 2, "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 2, "needTime" : 1, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "docsExamined" : 3, "alreadyHasObj" : 0, "inputStage" : { "stage" : "IXSCAN", "nReturned" : 3, "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 3, "needTime" : 0, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "keyPattern" : { "quantity" : 1 }, "indexName" : "quantity_1", "isMultiKey" : false, "multiKeyPaths" : { "quantity" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "quantity" : [ "[5.0, inf.0]" ] }, "keysExamined" : 3, "seeks" : 1, "dupsTested" : 0, "dupsDropped" : 0 } } }, { "nReturned" : 2, "executionTimeMillisEstimate" : 0, "totalKeysExamined" : 3, "totalDocsExamined" : 2, "executionStages" : { "stage" : "FETCH", "nReturned" : 2, "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 2, "needTime" : 1, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "docsExamined" : 2, "alreadyHasObj" : 0, "inputStage" : { "stage" : "IXSCAN", "nReturned" : 2, "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 2, "needTime" : 1, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "keyPattern" : { "quantity" : 1, "type" : 1 }, "indexName" : "quantity_1_type_1", "isMultiKey" : false, "multiKeyPaths" : { "quantity" : [ ], "type" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "quantity" : [ "[5.0, inf.0]" ], "type" : [ "[\"apparel\", \"apparel\"]" ] }, "keysExamined" : 3, "seeks" : 2, "dupsTested" : 0, "dupsDropped" : 0 } } } ], "candidatePlanScores" : [ 1.5002, 1.5002 ], "indexFilterSet" : false, "estimatedSizeBytes" : NumberLong(3160), // Available starting in MongoDB 5.0 "host" : "mongodb1.example.net:27018", "shard" : "shardA" // Available if run on sharded cluster } ]
警告
MongoDB 8.0以降、既存のqueryHash
フィールドの名前がplanCacheShapeHash
に変更されます。 以前のバージョンの MongoDB を使用している場合は、 planCacheShapeHash
ではなくqueryHash
が表示されます。
出力の詳細については、 $planCacheStats 出力 を参照してください。