$planCacheStats
정의
$planCacheStats
컬렉션 에 대한 계획 캐시 정보를 반환합니다. 이 단계는 각 계획 캐시 항목에 대한 문서 를 반환합니다.
$planCacheStats
단계는 파이프라인의 첫 번째 단계여야 합니다. 이 단계에는 다음과 같은 구문이 있습니다.{ $planCacheStats: { allHosts: <boolean> } } $planCacheStats
애그리게이션 단계에는 다음과 같은 옵션이 있습니다.옵션설명allHosts
$planCacheStats
애그리게이션 단계가 샤드 cluster의 노드를 대상으로 하는 방법을 구성합니다.true
인 경우,mongos
는 대상 collection에서 하나 이상의 청크를 포함하는 영향을 받은 각 샤드에 대해 모든 노드(프라이머리 및 세컨더리)에$planCacheStats
애그리게이션 단계를 브로드캐스트합니다.false
인 경우$planCacheStats
애그리게이션 단계는 읽기 설정 (read preference) 을 따르고 대상 복제본 세트 프라이머리에서만 계획 캐시를 검색합니다.
allHosts
가true
로 설정된 경우 복제본 세트 및 독립형 서버는 파이프라인 구문 분석 중에 오류를 반환합니다. 이 옵션은 샤딩된 cluster에서만 사용할 수 있습니다.기본값입니다:
false
버전 7.1에 새로 추가되었습니다.
고려 사항
파이프라인
$planCacheStats
는 집계 파이프라인의 첫 번째 단계여야 합니다.
제한 사항
$planCacheStats
다음에서는 허용되지 않습니다.$planCacheStats
읽기 고려 (read concern) 수준"local"
이(가) 필요합니다.
액세스 제어
authorization
를 통해 실행되는 시스템에서 사용자는 컬렉션에 대한 planCacheRead
권한이 있어야 합니다.
편집
Queryable Encryption을 사용하는 경우 $planCacheStats
단계에서는 작업이 정상적으로 캐시되더라도 암호화된 컬렉션에 대한 작업을 생략합니다.
읽기 설정
allHosts
옵션이 false
로 설정하다 경우 $planCacheStats
는 읽기 설정 (read preference) 을 따라 계획 캐시 정보를 반환할 호스팅하다 를 선택할 수 있습니다.
애플리케이션은 복제본 세트의 다른 노드를 대상으로 할 수 있습니다. 따라서 각 복제본 세트 노드는 서로 다른 읽기 명령을 수신하고 다른 노드와 다른 계획 캐시 정보를 가질 수 있습니다. 그럼에도 불구하고 복제본 세트 또는 분할된 클러스터에서 $planCacheStats
를 실행하는 것은 일반적인 읽기 기본 설정 규칙을 따릅니다. 즉, 복제본 세트에서는 복제본 세트의 한 노드로부터만 계획 캐시 정보를 수집하고, 샤드 클러스터에서는 각 샤드 복제본 세트의 노드로부터만 계획 캐시 정보를 수집하는 작업입니다.
출력
버전 7.0에서 변경되었습니다.
$planCacheStats
의 출력은 쿼리를 완료하는 데 사용된 쿼리 엔진에 따라 달라집니다. $planCacheStats
의 version
필드 값은 사용된 쿼리 엔진을 나타냅니다.
1
은 클래식 엔진이 사용되었음을 나타냅니다.2
는 슬롯 기반 쿼리 실행 엔진 이 사용되었음을 나타냅니다.
클래식 실행 엔진 을 사용하는 쿼리의 경우 $planCacheStats
는 다음과 유사한 문서 를 반환합니다.
{ "version" : 1, "createdFromQuery" : <document>, "planCacheShapeHash" : <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>, "querySettings" : <document>, "host" : <string>, "shard" : <string> }
각 문서에는 다음과 같은 다양한 쿼리 계획 및 실행 통계가 포함되어 있습니다.
필드 | 설명 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 쿼리를 완료하는 데 사용된 쿼리 엔진을 나타내는 숫자입니다.
| |||||||||||||||||||||||||
| 이 캐시 항목을 생성한 특정 쿼리가 포함된 문서입니다. 예를 들면 다음과 같습니다.
| |||||||||||||||||||||||||
| 항목이 활성 상태인지 비활성 상태인지를 나타내는 부울
계획 캐시 항목 상태를 참조하세요. | |||||||||||||||||||||||||
| 쿼리 형태 string 의 해시를 나타내는 16진수 입니다. MongoDB 8.0 부터 기존 | |||||||||||||||||||||||||
| 이 쿼리 와 연결된 계획 캐시 항목을 찾는 데 사용되는 키의 해시를 나타내는 16진수 string 입니다. 계획 캐시 키는 계획 캐시 쿼리 형태 와 해당 형태에 대해 현재 사용 가능한 인덱스 모두의 함수입니다. | |||||||||||||||||||||||||
| 캐시된 계획의 세부 정보입니다. | |||||||||||||||||||||||||
| 쿼리 플래너가 후보 계획을 평가하는 시도 기간 동안 쿼리 실행 계획에서 수행한 '작업 단위'의 수입니다. 자세한 내용은 | |||||||||||||||||||||||||
| 항목의 생성 시간입니다. | |||||||||||||||||||||||||
| 실행 통계 문서의 배열. 배열에는 각 후보 계획에 대한 문서가 포함되어 있습니다. 실행 통계에 대한 자세한 내용은 | |||||||||||||||||||||||||
|
| |||||||||||||||||||||||||
| 계획 캐시 쿼리 형태 에 대한 인덱스 필터하다가 존재하는지 여부를 나타내는 부울입니다. | |||||||||||||||||||||||||
| 계획 캐시 항목의 예상 크기(바이트)입니다. | |||||||||||||||||||||||||
| 버전 8.0에 추가 되었습니다. 이전에
| |||||||||||||||||||||||||
| ||||||||||||||||||||||||||
| 가 캐시 항목을 샤딩된 클러스터에서 실행하는 경우에만 사용할 수 있습니다. |
슬롯 기반 쿼리 실행 엔진을 사용하는 쿼리의 경우 $planCacheStats
는 다음과 유사한 문서를 반환합니다.
{ "version" : 2, "planCacheShapeHash" : <hexadecimal string>, "planCacheKey" : <hexadecimal string>, "isActive" : <boolean>, "works" : <NumberLong>, "cachedPlan" : { "slots" : <string>, "stages": <string> }, "indexFilterSet" : <boolean>, "estimatedSizeBytes" : <num>, "querySettings" : <document>, "host" : <string> }
각 문서에는 다음과 같은 다양한 쿼리 계획 및 실행 통계가 포함되어 있습니다.
필드 | 설명 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 쿼리를 완료하는 데 사용된 쿼리 엔진을 나타내는 숫자입니다.
| |||||||||||||||||||||||||
| 쿼리 형태 string 의 해시를 나타내는 16진수 입니다. MongoDB 8.0 부터 기존 | |||||||||||||||||||||||||
| 이 쿼리 와 연결된 계획 캐시 항목을 찾는 데 사용되는 키의 해시를 나타내는 16진수 string 입니다. 계획 캐시 키는 계획 캐시 쿼리 형태 와 해당 형태에 대해 현재 사용 가능한 인덱스 모두의 함수입니다. | |||||||||||||||||||||||||
| 항목이 활성 상태인지 비활성 상태인지를 나타내는 부울
계획 캐시 항목 상태를 참조하세요. | |||||||||||||||||||||||||
| 쿼리 플래너가 후보 계획을 평가하는 시도 기간 동안 쿼리 실행 계획에서 수행한 '작업 단위'의 수입니다. 자세한 내용은 | |||||||||||||||||||||||||
| 캐시된 계획의 세부 정보입니다. | |||||||||||||||||||||||||
| 계획 캐시 쿼리 형태 에 대한 인덱스 필터하다가 존재하는지 여부를 나타내는 부울입니다. | |||||||||||||||||||||||||
| 계획 캐시 항목의 예상 크기(바이트)입니다. | |||||||||||||||||||||||||
| 버전 8.0에 추가 되었습니다. 이전에
| |||||||||||||||||||||||||
|
예시
이 섹션의 예시에서는 다음의 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( { quantity: 1 } ); db.orders.createIndex( { quantity: 1, type: 1 } ); db.orders.createIndex( { item: 1, price: 1 }, { partialFilterExpression: { price: { $gte: NumberDecimal("10")} } } );
참고
인덱스 { 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" } )
앞의 쿼리는 슬롯 기반 쿼리 실행 엔진을 사용하여 완료됩니다.
쿼리 캐시의 모든 항목에 해당하는 정보 반환하기
다음 집계 파이프라인은 $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' } ],
경고
MongoDB 8.0 부터 기존 queryHash
필드 의 이름이 planCacheShapeHash
로 변경되었습니다. 이전 MongoDB 버전을 사용하는 경우 planCacheShapeHash
queryHash
가 표시됩니다.
쿼리 해시에 대한 캐시 항목 세부 정보 찾기
특정 쿼리 해시에 대한 계획 캐시 정보를 반환하려면 $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' } ]
경고
MongoDB 8.0 부터 기존 queryHash
필드 의 이름이 planCacheShapeHash
로 변경되었습니다. 이전 MongoDB 버전을 사용하는 경우 planCacheShapeHash
queryHash
가 표시됩니다.