Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

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 8.0 부터는 인덱스 필터 를 추가하는 대신 쿼리 설정을 사용합니다. 인덱스 필터는 MongoDB 8.0 부터 더 이상 사용되지 않습니다.

쿼리 설정에는 인덱스 필터보다 더 많은 기능이 있습니다. 또한 인덱스 필터는 영구적이지 않으며 모든 클러스터 노드에 대한 인덱스 필터를 쉽게 만들 수 없습니다. 쿼리 설정을 추가하고 예제를 탐색하려면 setQuerySettings 를 참조하세요.

PlanCache.list() 은(는) 트랜잭션에서 허용되지 않습니다.

동일한 계획 캐시 쿼리 형태 를 가진 느린 쿼리를 식별하는 데 도움이 되도록 각 계획 캐시 쿼리 형태 는 쿼리 해시와 연결됩니다. 계획 캐시 쿼리 형태 해시는 쿼리 형태의 해시를 나타내며 쿼리 형태 쿼리 형태 에만 종속되는 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 출력을 참조하세요.

돌아가기

PlanCache.help