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() 은(는) 현재 캐시된 쿼리 계획이 있는 쿼리 형태가 없는 경우 빈 배열을 반환합니다.

다음도 참조하세요.

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 출력을 참조하세요.

돌아가기

PlanCache.help