PlanCache.list()
이 페이지의 내용
정의
PlanCache.list(<pipeline>)
컬렉션 에 대한 계획 캐시 항목의 배열 을 반환합니다.
이 메서드는 특정 컬렉션의
plan cache object
에서만 사용할 수 있습니다. 즉, 다음과 같습니다.db.collection.getPlanCache().list(<pipeline>) 이 메서드는
mongod
또는mongos
인스턴스에서 실행할 수 있습니다. 이 메서드는 샤드 클러스터에서 실행될 때 각 샤드 복제본 세트의 단일 멤버로부터 계획 캐시 항목 정보를 반환합니다. 이 멤버는 샤드 및 호스트 필드로 식별됩니다. 읽기 설정도 참조하세요.PlanCache.list()
메서드는$planCacheStats
집계 파이프라인을 래핑합니다. 즉,db.collection.getPlanCache().list([<stage1>, <stage2>, ...] ) 는 다음과 같습니다.
db.collection.aggregate([ <$planCacheStats stage>, <stage1>, <stage2>, ... ]).toArray(); 출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.
모든 쿼리가 자동으로 쿼리 계획을 캐시에 배치하는 것은 아닙니다.
PlanCache.list()
은(는) 현재 캐시된 쿼리 계획이 있는 쿼리 형태가 없는 경우 빈 배열을 반환합니다.
고려 사항
제한 사항
쿼리 해시 및 쿼리 형태
동일한 쿼리 형태를 가진 느린 쿼리를 식별하는 데 도움이 되도록 각 쿼리 형태는 queryHash와 연결됩니다. queryHash
는 쿼리 형태의 해시를 나타내며 쿼리 형태에만 종속되는 16진수 문자열입니다.
참고
다른 해시 함수와 마찬가지로, 두 개의 다른 쿼리 형태가 동일한 해시 값을 생성할 수 있습니다. 그러나 서로 다른 쿼리 형태 간에 해시 충돌이 발생할 가능성은 거의 없습니다.
쿼리 옵티마이저는 실행 가능한 계획을 두 개 이상 가질 수 있는 쿼리 형태에 대한 계획만 캐시합니다.
계획 캐시의 각 항목은 queryHash
와 연결됩니다.
읽기 설정
PlanCache.list()
는 계획 캐시 정보를 반환할 호스트를 선택할 때 읽기 설정 을 관찰합니다.
애플리케이션은 복제본 세트의 다른 멤버를 대상으로 할 수 있습니다. 따라서 각 복제본 세트 멤버는 서로 다른 읽기 명령을 수신하고 다른 멤버와 다른 계획 캐시 정보를 가질 수 있습니다. 그럼에도 불구하고 복제본 세트 또는 샤드 클러스터에서 PlanCache.list()
를 실행하는 것은 일반적인 읽기 설정 규칙을 따릅니다. 즉, 복제본 세트에서 작업은 복제본 세트의 한 멤버로부터만 계획 캐시 정보를 수집하고, 샤드 클러스터에서는 각 샤드 복제본 세트의 한 멤버로부터 계획 캐시 정보를 수집합니다.
필요한 액세스 권한
authorization
를 통해 실행되는 시스템에서 사용자는 컬렉션에 대한 planCacheRead
권한이 있어야 합니다.
예시
참고
모든 쿼리가 자동으로 쿼리 계획을 캐시에 배치하는 것은 아닙니다.
PlanCache.list()
은(는) 현재 캐시된 쿼리 계획이 있는 쿼리 형태가 없는 경우 빈 배열을 반환합니다.출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.
이 섹션의 예시에서는 다음의 orders
collection을 사용합니다.
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")
보다 크거나 같은 인덱스된 문서만 인덱싱합니다.
collection에 대해 몇 가지 쿼리를 실행합니다.
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
collection에 대한 캐시된 계획이 있는 쿼리 형태 를 반환합니다.
db.orders.getPlanCache().list()
이 메서드는 현재 캐시에 있는 쿼리 형태의 배열을 반환합니다. 이 예제에서 orders
collection에는 다음 형태와 연결된 캐시된 쿼리 계획이 있었습니다.
[ { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 5 }, "type" : "apparel" }, "sort" : { }, "projection" : { } }, "queryHash" : "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" : { } }, "queryHash" : "23B19B75", "planCacheKey" : "6F23F858", "isActive" : false, "works" : NumberLong(1), ... }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("5") } }, "sort" : { }, "projection" : { } }, "queryHash" : "117A6B10", "planCacheKey" : "A1824628", "isActive" : false, "works" : NumberLong(4), ... }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("10") } }, "sort" : { }, "projection" : { } }, "queryHash" : "117A6B10", "planCacheKey" : "2E6E536B", "isActive" : false, "works" : NumberLong(3), ... } ]
출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.
쿼리 형태 나열
캐시된 계획이 있는 모든 쿼리 형태의 목록을 얻으려면 PlanCache.list()
를 사용할 수 있습니다. 예를 들어, 다음 작업은 $project
단계가 있는 파이프라인을 전달하여 createdFromQuery 필드와 queryHash 필드만 출력합니다.
db.orders.getPlanCache().list( [ { $project: {createdFromQuery: 1, queryHash: 1 } } ] )
이 작업은 다음과 같은 쿼리 형태를 반환합니다.
[ { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 5 }, "type" : "apparel" }, "sort" : { }, "projection" : { } }, "queryHash" : "4D151C4C" }, { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 20 } }, "sort" : { }, "projection" : { } }, "queryHash" : "23B19B75" }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("5") } }, "sort" : { }, "projection" : { } }, "queryHash" : "117A6B10" }, { "createdFromQuery" : { "query" : { "item" : "abc", "price" : { "$gte" : NumberDecimal("10") } }, "sort" : { }, "projection" : { } }, "queryHash" : "117A6B10" } ]
출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.
쿼리 형태에 대한 캐시 항목 세부 정보 찾기
특정 쿼리 형태에 대한 계획 캐시 정보를 반환하려면 planCacheKey 필드에 $match
가 포함된 파이프라인을 전달합니다.
db.orders.getPlanCache().list([ { $match: { planCacheKey: "DD67E353"} } ] )
이 연산은 다음을 반환합니다:
[ { "createdFromQuery" : { "query" : { "quantity" : { "$gte" : 5 }, "type" : "apparel" }, "sort" : { }, "projection" : { } }, "queryHash" : "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 } ]
출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.