PlanCache.list()
이 페이지의 내용
정의
PlanCache.list(<pipeline>)
컬렉션 에 대한 계획 캐시 항목의 배열 을 반환합니다.
이 메서드는 특정 컬렉션의
plan cache object
에서만 사용할 수 있습니다. 즉, 다음과 같습니다.db.collection.getPlanCache().list(<pipeline>) Parameter유형설명배열
선택 사항. 계획 캐시 쿼리 형태 를필터하다/ 프로세스 하는 집계 파이프라인 .
이 메서드는
mongod
mongos
또는 인스턴스 에서 실행 수 있습니다. 이 메서드는 샤딩된 클러스터 에서 실행 때 각 샤드 복제본 세트 의 단일 멤버로부터 계획 캐시 항목 정보를 반환합니다. 이 멤버는 샤드 및 호스팅하다 필드로 식별됩니다. 읽기 설정도 참조하세요.PlanCache.list()
메서드는$planCacheStats
집계 파이프라인을 래핑합니다. 즉,db.collection.getPlanCache().list([<stage1>, <stage2>, ...] ) 는 다음과 같습니다.
db.collection.aggregate([ <$planCacheStats stage>, <stage1>, <stage2>, ... ]).toArray(); 출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.
모든 쿼리가 자동으로 쿼리 계획 을 캐시 에 배치하는 것은 아닙니다.
PlanCache.list()
은(는) 현재 캐시된 쿼리 계획이 있는 계획 캐시 쿼리 형태가 없는 경우 빈 배열 을 반환합니다.다음도 참조하세요.
호환성
이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
고려 사항
쿼리 설정
MongoDB 8.0 부터는 인덱스 필터 를 추가하는 대신 쿼리 설정을 사용합니다. 인덱스 필터는 MongoDB 8.0 부터 더 이상 사용되지 않습니다.
쿼리 설정에는 인덱스 필터보다 더 많은 기능이 있습니다. 또한 인덱스 필터는 영구적이지 않으며 모든 클러스터 노드에 대한 인덱스 필터를 쉽게 만들 수 없습니다. 쿼리 설정을 추가하고 예제를 탐색하려면 setQuerySettings
를 참조하세요.
제한 사항
쿼리 해시 및 계획 캐시 쿼리 형태
동일한 계획 캐시 쿼리 형태 를 가진 느린 쿼리를 식별하는 데 도움이 되도록 각 계획 캐시 쿼리 형태 는 쿼리 해시와 연결됩니다. 계획 캐시 쿼리 형태 해시는 쿼리 형태의 해시를 나타내며 쿼리 형태 쿼리 형태 에만 종속되는 16진수 string 입니다.
참고
다른 해시 함수와 마찬가지로, 두 개의 다른 쿼리 형태가 동일한 해시 값을 생성할 수 있습니다. 그러나 서로 다른 쿼리 형태 간에 해시 충돌이 발생할 가능성은 거의 없습니다.
MongoDB 8.0부터 기존 queryHash
필드 planCacheShapeHash
라는 새 필드 에 중복됩니다. 이전 MongoDB 버전을 사용하는 경우 queryHash
필드 만 표시됩니다. 향후 MongoDB 버전에서는 더 이상 사용되지 않는 queryHash
필드 제거 될 예정이며, 대신 planCacheShapeHash
필드 사용해야 합니다.
쿼리 옵티마이저 둘 이상의 실행 가능한 계획을 가질 수 있는 계획 캐시 쿼리 형태 에 대해서만 계획을 캐시합니다.
계획 캐시의 각 항목은 planCacheShapeHash
와 연결됩니다.
경고
MongoDB 8.0부터 기존 queryHash
필드 planCacheShapeHash
라는 새 필드 에 중복됩니다. 이전 MongoDB 버전을 사용하는 경우 queryHash
필드 만 표시됩니다. 향후 MongoDB 버전에서는 더 이상 사용되지 않는 queryHash
필드 제거 될 예정이며, 대신 planCacheShapeHash
필드 사용해야 합니다.
읽기 설정
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
컬렉션 에 대해 캐시된 계획이 있는 계획 캐시 쿼리 형태 를 반환합니다.
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 버전을 사용하는 경우 queryHash
필드 만 표시됩니다. 향후 MongoDB 버전에서는 더 이상 사용되지 않는 queryHash
필드 제거 될 예정이며, 대신 planCacheShapeHash
필드 사용해야 합니다.
출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.
계획 캐시 쿼리 형태 나열
캐시된 계획이 있는 모든 쿼리 형태의 목록을 얻으려면 PlanCache.list()
를 사용할 수 있습니다. 예를 예시, 다음 작업은 $project
단계가 있는 파이프라인 을 통해 createdFromQuery 필드 와 planCacheShapeHash 필드 만 출력합니다.
db.orders.getPlanCache().list( [ { $project: {createdFromQuery: 1, planCacheShapeHash: 1 } } ] )
경고
MongoDB 8.0부터 기존 queryHash
필드 planCacheShapeHash
라는 새 필드 에 중복됩니다. 이전 MongoDB 버전을 사용하는 경우 queryHash
필드 만 표시됩니다. 향후 MongoDB 버전에서는 더 이상 사용되지 않는 queryHash
필드 제거 될 예정이며, 대신 planCacheShapeHash
필드 사용해야 합니다.
이 작업은 다음과 같은 계획 캐시 쿼리 형태를 반환합니다.
[ { "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 출력을 참조하세요.
계획 캐시 쿼리 형태에 대한 캐시 항목 세부 정보 찾기
특정 쿼리 형태에 대한 계획 캐시 정보를 반환하려면 planCacheKey 필드에 $match
가 포함된 파이프라인을 전달합니다.
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 버전을 사용하는 경우 queryHash
필드 만 표시됩니다. 향후 MongoDB 버전에서는 더 이상 사용되지 않는 queryHash
필드 제거 될 예정이며, 대신 planCacheShapeHash
필드 사용해야 합니다.
출력에 대한 자세한 내용은 $planCacheStats 출력을 참조하세요.