문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ / /

$planCacheStats

이 페이지의 내용

  • 정의
  • 고려 사항
  • 파이프라인
  • 제한 사항
  • 액세스 제어
  • 편집
  • 읽기 설정
  • 출력
  • 예제
  • 쿼리 캐시의 모든 항목에 해당하는 정보 반환하기
  • 쿼리 해시에 대한 캐시 항목 세부 정보 찾기
$planCacheStats

컬렉션에 대한 계획 캐시 정보를 반환합니다. 이 단계는 각 계획 캐시 항목에 대한 문서를 반환합니다.

$planCacheStats 단계는 파이프라인의 첫 번째 단계여야 합니다. 이 단계에는 다음과 같은 구문이 있습니다.

{
$planCacheStats: {
allHosts: <boolean>
}
}

$planCacheStats 애그리게이션 단계에는 다음과 같은 옵션이 있습니다.

옵션
설명
allHosts

$planCacheStats 애그리게이션 단계가 샤드 cluster의 노드를 대상으로 하는 방법을 구성합니다.

  • true 인 경우, mongos 는 대상 collection에서 하나 이상의 청크를 포함하는 영향을 받은 각 샤드에 대해 모든 노드(프라이머리 및 세컨더리)에 $planCacheStats 애그리게이션 단계를 브로드캐스트합니다.

  • false 인 경우 $planCacheStats 애그리게이션 단계는 읽기 설정 (read preference) 을 따르고 대상 복제본 세트 프라이머리에서만 계획 캐시를 검색합니다.

참고

allHoststrue 로 설정된 경우 복제본 세트 및 독립형 서버는 파이프라인 구문 분석 중에 오류를 반환합니다. 이 옵션은 샤딩된 cluster에서만 사용할 수 있습니다.

기본값입니다: false

버전 7.1에 새로 추가되었습니다.

다음도 참조하세요.

$planCacheStats 는 aggregation pipeline의 첫 번째 단계여야 합니다.

authorization를 통해 실행되는 시스템에서 사용자는 컬렉션에 대한 planCacheRead 권한이 있어야 합니다.

Queryable Encryption을 사용하는 경우 $planCacheStats 단계에서는 작업이 정상적으로 캐시되더라도 암호화된 컬렉션에 대한 작업을 생략합니다.

allHosts 옵션이 false 로 설정된 경우, $planCacheStats읽기 설정 을 따라 계획 캐시 정보를 반환할 호스트를 선택합니다.

애플리케이션은 복제본 세트의 다른 노드를 대상으로 할 수 있습니다. 따라서 각 복제본 세트 노드는 서로 다른 읽기 명령을 수신하고 다른 노드와 다른 계획 캐시 정보를 가질 수 있습니다. 그럼에도 불구하고 복제본 세트 또는 분할된 클러스터에서 $planCacheStats를 실행하는 것은 일반적인 읽기 기본 설정 규칙을 따릅니다. 즉, 복제본 세트에서는 복제본 세트의 한 노드로부터만 계획 캐시 정보를 수집하고, 샤드 클러스터에서는 각 샤드 복제본 세트의 노드로부터만 계획 캐시 정보를 수집하는 작업입니다.

버전 7.0에서 변경되었습니다.

$planCacheStats의 출력은 쿼리를 완료하는 데 사용된 쿼리 엔진에 따라 달라집니다. $planCacheStatsversion 필드 값은 사용된 쿼리 엔진을 나타냅니다.

클래식 실행 엔진을 사용하는 쿼리의 경우 $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>
}

각 문서에는 다음과 같은 다양한 쿼리 계획 및 실행 통계가 포함되어 있습니다.

필드
설명
version

쿼리를 완료하는 데 사용된 쿼리 엔진을 나타내는 숫자입니다.

createdFromQuery

이 캐시 항목을 생성한 특정 쿼리가 포함된 문서입니다. 예를 들면 다음과 같습니다.

{
"query" : <document>,
"sort" : <document>,
"projection" : <document>
}
isActive

항목이 활성 상태인지 비활성 상태인지를 나타내는 부울

  • 활성화된 경우, 쿼리 플래너가 현재 항목을 사용해 쿼리 계획을 생성하고 있다는 의미입니다.

  • 비활성 상태인 경우 쿼리 플래너는 현재 이 항목을 사용하여 쿼리 계획을 생성하지 않습니다.

계획 캐시 항목 상태를 참조하세요.

queryHash

쿼리 형태 의 해시를 나타내는 16진수 문자열입니다. explain.queryPlanner.queryHash 를 참조하세요.

planCacheKey

이 쿼리와 연결된 계획 캐시 항목을 찾는 데 사용되는 키의 해시를 나타내는 16진수 문자열입니다. 계획 캐시 키는 쿼리 형태와 해당 형태에 대해 현재 사용 가능한 인덱스 모두의 함수입니다. explain.queryPlanner.planCacheKey 를 참조하세요.

cachedPlan

캐시된 계획의 세부 정보입니다. cachedPlan 에 포함된 필드는 쿼리가 클래식 엔진을 사용하여 완료되었는지 또는 슬롯 기반 쿼리 실행 엔진을 사용하여 완료되었는지에 따라 달라집니다. 쿼리 계획에 대한 자세한 내용은 explain.queryPlanner 를 참조하세요.

works

쿼리 플래너가 후보 계획을 평가하는 시도 기간 동안 쿼리 실행 계획에서 수행한 '작업 단위'의 수입니다. 자세한 내용은 explain.executionStats.executionStages.works 를 참조하세요.

timeOfCreation
항목의 생성 시간입니다.
creationExecStats

실행 통계 문서의 배열. 배열에는 각 후보 계획에 대한 문서가 포함되어 있습니다.

실행 통계에 대한 자세한 내용은 explain.executionStats를 참조하세요.

candidatePlanScores

creationExecStats 배열에 나열된 후보 계획에 대한 점수의 배열입니다.

indexFilterSet

쿼리 형태에 대한 인덱스 필터 가 있는지 여부를 나타내는 부울입니다.

estimatedSizeBytes

계획 캐시 항목의 예상 크기(바이트)입니다.

host

계획 캐시 정보가 반환된 mongod 인스턴스의 호스트 이름 및 포트입니다.

샤드 클러스터에서 실행되는 경우 이 작업은 각 샤드 복제본 세트의 단일 멤버로부터 계획 캐시 항목 정보를 반환합니다. 이 멤버는 샤드호스트 필드로 식별됩니다. 편집도 참조하세요 .

shard

$planCacheStats(이)가 캐시 항목을 검색한 샤드의 이름입니다.

샤딩된 클러스터에서 실행하는 경우에만 사용할 수 있습니다.

슬롯 기반 쿼리 실행 엔진을 사용하는 쿼리의 경우 $planCacheStats 는 다음과 유사한 문서를 반환합니다.

{
"version" : 2,
"queryHash" : <hexadecimal string>,
"planCacheKey" : <hexadecimal string>,
"isActive" : <boolean>,
"works" : <NumberLong>,
"cachedPlan" : {
"slots" : <string>,
"stages": <string>
},
"indexFilterSet" : <boolean>,
"estimatedSizeBytes" : <num>,
"host" : <string>
}

각 문서에는 다음과 같은 다양한 쿼리 계획 및 실행 통계가 포함되어 있습니다.

필드
설명
version

쿼리를 완료하는 데 사용된 쿼리 엔진을 나타내는 숫자입니다.

queryHash

쿼리 형태 의 해시를 나타내는 16진수 문자열입니다. explain.queryPlanner.queryHash 를 참조하세요.

planCacheKey

이 쿼리와 연결된 계획 캐시 항목을 찾는 데 사용되는 키의 해시를 나타내는 16진수 문자열입니다. 계획 캐시 키는 쿼리 형태와 해당 형태에 대해 현재 사용 가능한 인덱스 모두의 함수입니다. explain.queryPlanner.planCacheKey 를 참조하세요.

isActive

항목이 활성 상태인지 비활성 상태인지를 나타내는 부울

  • 활성화된 경우, 쿼리 플래너가 현재 항목을 사용해 쿼리 계획을 생성하고 있다는 의미입니다.

  • 비활성 상태인 경우 쿼리 플래너는 현재 이 항목을 사용하여 쿼리 계획을 생성하지 않습니다.

계획 캐시 항목 상태를 참조하세요.

works

쿼리 플래너가 후보 계획을 평가하는 시도 기간 동안 쿼리 실행 계획에서 수행한 '작업 단위'의 수입니다. 자세한 내용은 explain.executionStats.executionStages.works 를 참조하세요.

cachedPlan

캐시된 계획의 세부 정보입니다. cachedPlan 에 포함된 필드는 쿼리가 클래식 엔진을 사용하여 완료되었는지 또는 슬롯 기반 쿼리 실행 엔진을 사용하여 완료되었는지에 따라 달라집니다. 쿼리 계획에 대한 자세한 내용은 explain.queryPlanner 를 참조하세요.

indexFilterSet

쿼리 형태에 대한 인덱스 필터 가 있는지 여부를 나타내는 부울입니다.

estimatedSizeBytes

계획 캐시 항목의 예상 크기(바이트)입니다.

host

계획 캐시 정보가 반환된 mongod 인스턴스의 호스트 이름 및 포트입니다.

샤드 클러스터에서 실행되는 경우 이 작업은 각 샤드 복제본 세트의 단일 멤버로부터 계획 캐시 항목 정보를 반환합니다. 이 멤버는 샤드호스트 필드로 식별됩니다. 편집도 참조하세요 .

이 섹션의 예시에서는 다음의 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',
queryHash: '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',
queryHash: '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',
queryHash: '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',
queryHash: '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',
queryHash: '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'
}
]

planCacheKeyqueryHash 도 참조하세요.

돌아가기

$out

다음

프로젝트