정의
- $planCacheStats
- 컬렉션 에 대한 계획 캐시 정보를 반환합니다. 이 단계는 각 계획 캐시 항목에 대한 문서 를 반환합니다. - $planCacheStats단계는 파이프라인의 첫 번째 단계여야 합니다. 단계는 빈 문서를 매개변수로 사용하며 구문은 다음과 같습니다.- { $planCacheStats: { } } 
고려 사항
파이프라인
$planCacheStats 는 집계 파이프라인의 첫 번째 단계여야 합니다.
제한 사항
- $planCacheStats다음에서는 허용되지 않습니다.
- $planCacheStats읽기 고려 (read concern) 수준- "local"이(가) 필요합니다.
액세스 제어
authorization를 통해 실행되는 시스템에서 사용자는 컬렉션에 대한 planCacheRead 권한이 있어야 합니다.
편집
Queryable Encryption을 사용하는 경우 $planCacheStats 단계에서는 작업이 정상적으로 캐시되더라도 암호화된 컬렉션에 대한 작업을 생략합니다.
읽기 설정
$planCacheStats 는 계획 캐시 정보를 반환할 호스트를 선택할 때 읽기 설정 (read preference) 을 관찰합니다.
애플리케이션은 복제본 세트의 다른 노드를 대상으로 할 수 있습니다. 따라서 각 복제본 세트 노드는 서로 다른 읽기 명령을 수신하고 다른 노드와 다른 계획 캐시 정보를 가질 수 있습니다. 그럼에도 불구하고 복제본 세트 또는 분할된 클러스터에서 $planCacheStats를 실행하는 것은 일반적인 읽기 기본 설정 규칙을 따릅니다. 즉, 복제본 세트에서는 복제본 세트의 한 노드로부터만 계획 캐시 정보를 수집하고, 샤드 클러스터에서는 각 샤드 복제본 세트의 노드로부터만 계획 캐시 정보를 수집하는 작업입니다.
출력
버전 7.0에서 변경되었습니다.
$planCacheStats의 출력은 쿼리를 완료하는 데 사용된 쿼리 엔진에 따라 달라집니다. $planCacheStats의 version 필드 값은 사용된 쿼리 엔진을 나타냅니다.
- 1은 클래식 엔진이 사용되었음을 나타냅니다.
- 2는 슬롯 기반 쿼리 실행 엔진 이 사용되었음을 나타냅니다.
참고
버전 7.0.17부터 7.0의 패치 버전에 대해 슬롯 기반 쿼리 실행 엔진 더 이상 기본값 으로 활성화되지 않습니다. 쿼리에서 슬롯 기반 쿼리 실행 엔진 사용하려면 8.0 버전으로 업그레이드 하세요. 기본값 으로 활성화되어 있습니다.
클래식 실행 엔진 을 사용하는 쿼리의 경우 $planCacheStats 는 다음과 유사한 문서 를 반환합니다.
{    "version" : 1,    "createdFromQuery" : <document>,    "queryHash" : <hexadecimal string>,    "planCacheKey" : <hexadecimal string>,    "isActive" :  <boolean>,    "works" : <NumberLong>,    "cachedPlan" : {       "stage" : <STAGE1>,       "filter" : <document>,       "inputStage" : {          "stage" : <STAGE2>,          ...       }    },    "timeOfCreation" : <date>,    "creationExecStats" : [   // Exec Stats Document for each candidate plan       {          "nReturned" : <num>,          "executionTimeMillisEstimate" : <num>,          "totalKeysExamined" : <num>,          "totalDocsExamined" :<num>,          "executionStages" : {             "stage" : <STAGE A>,             ...             "inputStage" : {                "stage" : <STAGE B>,                ...             }          }       },       ...    ],    "candidatePlanScores" : [       <number>,       ...    ],    "indexFilterSet" : <boolean>,    "estimatedSizeBytes" : <num>,    "host" : <string>,    "shard" : <string> } 
각 문서에는 다음과 같은 다양한 쿼리 계획 및 실행 통계가 포함되어 있습니다.
| 필드 | 설명 | |||||
|---|---|---|---|---|---|---|
| 
 | 쿼리를 완료하는 데 사용된 쿼리 엔진을 나타내는 숫자입니다. 
 | |||||
| 
 | 이 캐시 항목을 생성한 특정 쿼리가 포함된 문서입니다. 예를 들면 다음과 같습니다.  | |||||
| 
 | 항목이 활성 상태인지 비활성 상태인지를 나타내는 부울 
 계획 캐시 항목 상태를 참조하세요. | |||||
| 
 | 쿼리 형태 string 의 해시를 나타내는 16진수 입니다.  | |||||
| 
 | 이 쿼리 와 연결된 계획 캐시 항목을 찾는 데 사용되는 키의 해시를 나타내는 16진수 string 입니다. 계획 캐시 키는 쿼리 형태 와 해당 형태에 대해 현재 사용 가능한 인덱스 모두의 함수입니다.  | |||||
| 
 | 캐시된 계획의 세부 정보입니다.  | |||||
| 
 | 쿼리 플래너가 후보 계획을 평가하는 시도 기간 동안 쿼리 실행 계획에서 수행한 '작업 단위'의 수입니다. 자세한 내용은  | |||||
| 
 | 항목의 생성 시간입니다. | |||||
| 
 | 실행 통계 문서의 배열. 배열에는 각 후보 계획에 대한 문서가 포함되어 있습니다. 실행 통계에 대한 자세한 내용은  | |||||
| 
 | 
 | |||||
| 
 | 쿼리 형태 에 대한 인덱스 필터하다 가 있는지 여부를 나타내는 부울입니다. | |||||
| 
 | 계획 캐시 항목의 예상 크기(바이트)입니다. | |||||
| 
 | ||||||
| 
 | 캐시 항목을 검색한  샤딩된 클러스터에서 실행하는 경우에만 사용할 수 있습니다. | 
슬롯 기반 쿼리 실행 엔진을 사용하는 쿼리의 경우 $planCacheStats 는 다음과 유사한 문서를 반환합니다.
{    "version" : 2,    "queryHash" : <hexadecimal string>,    "planCacheKey" : <hexadecimal string>,    "isActive" :  <boolean>,    "works" : <NumberLong>,    "cachedPlan" : {       "slots" : <string>,       "stages": <string>    },    "indexFilterSet" : <boolean>,    "estimatedSizeBytes" : <num>,    "host" : <string> } 
각 문서에는 다음과 같은 다양한 쿼리 계획 및 실행 통계가 포함되어 있습니다.
| 필드 | 설명 | 
|---|---|
| 
 | 쿼리를 완료하는 데 사용된 쿼리 엔진을 나타내는 숫자입니다. 
 | 
| 
 | 쿼리 형태 string 의 해시를 나타내는 16진수 입니다.  | 
| 
 | 이 쿼리 와 연결된 계획 캐시 항목을 찾는 데 사용되는 키의 해시를 나타내는 16진수 string 입니다. 계획 캐시 키는 쿼리 형태 와 해당 형태에 대해 현재 사용 가능한 인덱스 모두의 함수입니다.  | 
| 
 | 항목이 활성 상태인지 비활성 상태인지를 나타내는 부울 
 계획 캐시 항목 상태를 참조하세요. | 
| 
 | 쿼리 플래너가 후보 계획을 평가하는 시도 기간 동안 쿼리 실행 계획에서 수행한 '작업 단위'의 수입니다. 자세한 내용은  | 
| 
 | 캐시된 계획의 세부 정보입니다.  | 
| 
 | 쿼리 형태 에 대한 인덱스 필터하다 가 있는지 여부를 나타내는 부울입니다. | 
| 
 | 계획 캐시 항목의 예상 크기(바이트)입니다. | 
| 
 | 
예시
이 섹션의 예시에서는 다음의 orders collection을 사용합니다.
db.orders.insertMany( [     { "_id" : 1, "item" : "abc", "price" : Decimal128("12"), "quantity" : 2, "type": "apparel" },     { "_id" : 2, "item" : "jkl", "price" : Decimal128("20"), "quantity" : 1, "type": "electronics" },     { "_id" : 3, "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type": "apparel" },     { "_id" : 4, "item" : "abc", "price" : Decimal128("8"), "quantity" : 10, "type": "apparel" },     { "_id" : 5, "item" : "jkl", "price" : Decimal128("15"), "quantity" : 15, "type": "electronics" } ] ) 
컬렉션에 다음 인덱스를 만듭니다.
db.orders.createIndex( { item: 1 } ); db.orders.createIndex( { item: 1, quantity: 1 } ); db.orders.createIndex( { quantity: 1 } ); db.orders.createIndex( { quantity: 1, type: 1 } ); db.orders.createIndex(     { item: 1, price: 1 },     { partialFilterExpression: { price: { $gte: Decimal128("10")} } } ); 
참고
인덱스 { item: 1, price: 1 } 은 부분 인덱스이며 price 필드가 Decimal128("10")보다 크거나 같은 인덱스된 문서만 인덱싱합니다.
collection에 대해 몇 가지 쿼리를 실행합니다.
db.orders.find( { item: "abc", price: { $gte: Decimal128("10") } } ) db.orders.find( { item: "abc", price: { $gte: Decimal128("5") } } ) db.orders.find( { quantity: { $gte: 20 } } ) db.orders.find( { quantity: { $gte: 5 }, type: "apparel" } ) 
앞의 쿼리는 슬롯 기반 쿼리 실행 엔진을 사용하여 완료됩니다.
쿼리 캐시의 모든 항목에 해당하는 정보 반환하기
다음 집계 파이프라인 $planCacheStats 을(를) 사용하여 컬렉션 의 계획 캐시 항목에 대한 정보를 반환합니다.
db.orders.aggregate( [     { $planCacheStats: { } } ] ) 
출력:
[   {                                             // Plan Cache Entry 1     version: '2',     planCacheShapeHash: '478AD696',     planCacheKey: '21AE23AD',     isActive: true,     works: Long("7"),     timeOfCreation: ISODate("2023-05-22T20:33:49.031Z"),     cachedPlan: {       ...     },     indexFilterSet: false,     isPinned: false,     estimatedSizeBytes: Long("8194"),     host: 'mongodb1.example.net:27018'   },   {                                             // Plan Cache Entry 2         version: '2',         planCacheShapeHash: '3D8AFDC6',         planCacheKey: '1C2C4360',         isActive: true,         works: Long("6"),         timeOfCreation: ISODate("2023-05-22T20:33:50.584Z"),         cachedPlan: {           ...         },         indexFilterSet: false,         isPinned: false,         estimatedSizeBytes: Long("11547"),         host: 'mongodb1.example.net:27018'       },       {                                          // Plan Cache Entry 3         version: '2',         planCacheShapeHash: '27285F9B',         planCacheKey: '20BB9404',         isActive: true,         works: Long("1"),         timeOfCreation: ISODate("2023-05-22T20:33:49.051Z"),         cachedPlan: {           ...         },         indexFilterSet: false,         isPinned: false,         estimatedSizeBytes: Long("7406"),         host: 'mongodb1.example.net:27018'       },       {                                          // Plan Cache Entry 4         version: '2',         planCacheShapeHash: '478AD696',         planCacheKey: 'B1435201',         isActive: true,         works: Long("5"),         timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),         cachedPlan: {           ...         },         indexFilterSet: false,         isPinned: false,         estimatedSizeBytes: Long("7415"),         host: 'mongodb1.example.net:27018'       } 
planCacheKey도 참조하세요.
쿼리 해시에 대한 캐시 항목 세부 정보 찾기
특정 쿼리 해시에 대한 계획 캐시 정보를 반환하려면 $planCacheStats 단계 다음에 planCacheKey 필드에 $match 을 입력하면 됩니다.
다음 집계 파이프라인은 $planCacheStats에 이어 $match 단계를 사용하여 특정 쿼리 해시에 대한 특정 정보를 반환합니다.
db.orders.aggregate( [     { $planCacheStats: { } },     { $match: { planCacheKey: "B1435201"} } ] ) 
출력:
[   {     version: '2',     planCacheShapeHash: '478AD696',     planCacheKey: 'B1435201',     isActive: true,     works: Long("5"),     timeOfCreation: ISODate("2023-05-22T20:33:49.009Z"),     cachedPlan: {       slots: '$$RESULT=s11 env: { s3 = 1684787629009 (NOW), s6 = Nothing, s5 = Nothing, s1 = TimeZoneDatabase(Asia/Kuwait...Etc/UCT) (timeZoneDB), s10 = {"item" : 1, "price" : 1}, s2 = Nothing (SEARCH_META) }',       stages: '[2] nlj inner [] [s4, s7, s8, s9, s10] \n' +         '    left \n' +         '        [1] cfilter {(exists(s5) && exists(s6))} \n' +         '        [1] ixseek s5 s6 s9 s4 s7 s8 [] @"358822b7-c129-47b7-ad7f-40017a51b03c" @"item_1_price_1" true \n' +         '    right \n' +         '        [2] limit 1 \n' +         '        [2] seek s4 s11 s12 s7 s8 s9 s10 none none [] @"358822b7-c129-47b7-ad7f-40017a51b03c" true false \n'     },     indexFilterSet: false,     isPinned: false,     estimatedSizeBytes: Long("7415"),     host: 'mongodb1.example.net:27018'   } ] 
planCacheKey 및 queryHash 도 참조하세요.
MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $planCacheStats 단계를 추가하려면 파이프라인 객체 에서 $planCacheStats 연산자 사용합니다.
쿼리 캐시의 모든 항목에 해당하는 정보 반환하기
다음 예시 컬렉션 의 계획 캐시 항목에 대한 정보를 반환하는 파이프라인 단계를 만듭니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.
const pipeline = [{ $planCacheStats: {} }]; const cursor = collection.aggregate(pipeline); return cursor; 
쿼리 해시에 대한 캐시 항목 세부 정보 찾기
특정 쿼리 해시에 대한 계획 캐시 정보를 반환하려면 planCacheKey 필드 에서 특정 쿼리 해시를 확인하는 $match 단계를 포함합니다.
다음 예시 "B1435201"의 쿼리 해시 값에 대한 정보를 반환하는 파이프라인 만듭니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.
const pipeline = [  $planCacheStats: {} },   { $match: { planCacheKey: "B1435201"} } ]; const cursor = collection.aggregate(pipeline); return cursor;