결과 설명
이 페이지의 내용
MongoDB는 쿼리 계획 및 쿼리 계획의 실행 통계에 대한 정보를 반환하기 위해 다음을 제공합니다.
cursor.explain()
메서드 및explain
명령.
explain
결과는 쿼리 계획을 단계 트리로 표시합니다.
"winningPlan" : { "stage" : <STAGE1>, ... "inputStage" : { "stage" : <STAGE2>, ... "inputStage" : { "stage" : <STAGE3>, ... } } },
각 단계는 결과를 전달합니다(예: 문서 또는 인덱스 키)를 상위 노드 에 추가합니다. 리프 노드는 컬렉션 또는 인덱스에 액세스 합니다. 내부 노드는 하위 노드에서 생성되는 문서 또는 인덱스 키를 조작합니다. 루트 노드 는 MongoDB 가 결과 설정하다 를 도출하는 마지막 단계입니다.
단계는 작업을 설명합니다. 예:
COLLSCAN
컬렉션 스캔용IXSCAN
인덱스 키 스캔용FETCH
문서 검색용SHARD_MERGE
샤드에서 결과를 병합하는 경우SHARDING_FILTER
샤드에서 고아 문서를 필터링하기 위해
설명 출력
다음 섹션에서는 explain
작업에서 반환되는 일부 키 필드 목록을 제공합니다.
참고
필드 목록은 포괄적인 것은 아니지만, 이전 버전의 explain의 몇 가지 주요 필드 변경 사항을 강조하기 위한 것입니다.
출력 형식은 릴리스마다 변경될 수 있습니다.
queryPlanner
queryPlanner
정보는 쿼리 옵티마이저에서 선택한 플랜을 자세히 설명합니다.
샤딩되지 않은 컬렉션의 경우 explain
은 다음 queryPlanner
정보를 반환합니다.
"queryPlanner" : { "plannerVersion" : <int>, "namespace" : <string>, "indexFilterSet" : <boolean>, "parsedQuery" : { ... }, "queryHash" : <hexadecimal string>, "planCacheKey" : <hexadecimal string>, "optimizedPipeline" : <boolean>, // Starting in MongoDB 4.2, only appears if true "winningPlan" : { "stage" : <STAGE1>, ... "inputStage" : { "stage" : <STAGE2>, ... "inputStage" : { ... } } }, "rejectedPlans" : [ <candidate plan 1>, ... ] }
샤딩된 컬렉션의 경우 explain
에는 shards
필드의 액세스된 각 샤드에 대한 핵심 쿼리 플래너 및 서버 정보가 포함됩니다.
"queryPlanner" : { "mongosPlannerVersion" : <int>, "winningPlan" : { "stage" : <STAGE1>, "shards" : [ { "shardName" : <string>, "connectionString" : <string>, "serverInfo" : { "host" : <string>, "port" : <int>, "version" : <string>, "gitVersion" : <string> }, "plannerVersion" : <int>, "namespace" : <string>, "parsedQuery" : <document>, "queryHash" : <hexadecimal string>, "planCacheKey" : <hexadecimal string>, "optimizedPipeline" : <boolean>, // Starting in MongoDB 4.2, only appears if true "winningPlan" : { "stage" : <STAGE2>, "inputStage" : { "stage" : <STAGE3> ..., } }, rejectedPlans: [ <candidate plan1>, ] } ] } }
explain.queryPlanner
쿼리 최적화 프로그램에서 선택한 쿼리 계획에 대한 정보가 들어 있습니다.
explain.queryPlanner.namespace
쿼리에서 액세스하는 데이터베이스 및 컬렉션의 이름이 포함된 네임스페이스를 지정하는 문자열입니다. 네임스페이스의 형식은
<database>.<collection>
입니다.
explain.queryPlanner.queryHash
쿼리 형태의 해시를 나타내며 쿼리 형태에만 종속되는 16진수 문자열입니다.
queryHash
는 같은 쿼리 형태를 가진 느린 쿼리(쓰기 작업의 쿼리 필터 포함)를 식별하는 데 도움이 될 수 있습니다.참고
다른 해시 함수와 마찬가지로, 두 개의 다른 쿼리 형태가 동일한 해시 값을 생성할 수 있습니다. 그러나 서로 다른 쿼리 형태 간에 해시 충돌이 발생할 가능성은 거의 없습니다.
queryHash
및planCacheKey
에 대한 자세한 내용은queryHash
및planCacheKey
를 참조하십시오.버전 4.2에 추가되었습니다.
explain.queryPlanner.planCacheKey
쿼리와 연관된 계획 캐시 항목에 대한 키의 해시입니다.
queryHash
와 달리planCacheKey
는 쿼리 형태와 해당 형태에 대해 현재 사용 가능한 모든 인덱스의 함수입니다. 즉, 쿼리 형태를 지원할 수 있는 인덱스를 추가/제거하면planCacheKey
값은 변경될 수 있으나queryHash
값은 변경되지 않습니다.queryHash
및planCacheKey
에 대한 자세한 내용은queryHash
및planCacheKey
를 참조하십시오.버전 4.2에 추가되었습니다.
explain.queryPlanner.optimizedPipeline
전체 집계 파이프라인 작업이 최적화되고 대신 쿼리 계획 실행 단계 트리에 의해 이행되었음을 나타내는 부울입니다.
예를 들어, 다음 집계 작업은 집계 파이프라인을 사용하지 않고 쿼리 계획 실행 트리에서 수행할 수 있습니다.
db.example.aggregate([ { $match: { someFlag: true } } ] ) 이 필드는 값이
true
인 경우에만 표시되며 집계 파이프라인 작업에 대한 설명에만 적용됩니다.true
인 경우 파이프라인이 최적화되었기 때문에 집계 단계 정보가 출력에 표시되지 않습니다.버전 4.2에 추가되었습니다.
explain.queryPlanner.winningPlan
쿼리 옵티마이저 저가 선택한 계획을 자세히 설명하는 문서 입니다. MongoDB 는 계획을 단계 트리로 표시합니다. 즉, 스테이지에
inputStage
가 있을 수 있으며, 스테이지에 하위 스테이지가 여러 개 있는 경우inputStages
가 될 수 있습니다.explain.queryPlanner.winningPlan.stage
단계의 이름을 나타내는 문자열입니다.
각 단계는 해당 단계에 특정한 정보로 구성되어 있습니다. 예를 인스턴스
IXSCAN
단계에는 인덱스 스캔과 관련된 다른 데이터와 함께 인덱스 바운드 가 포함됩니다. 단계에 하위 단계가 하나 또는 여러 개 있는 경우 해당 단계에는 하나 이상의 inputStage가 있습니다.
executionStats
반환된 executionStats
정보에는 성공적인 계획의 실행 방법이 자세히 설명되어 있습니다. 결과에 executionStats
를 포함하려면 다음 중 하나에서 explain을 실행해야 합니다.
allPlansExecution 세부 정보 표시 모드입니다.
allPlansExecution
모드를 사용하여 계획 선택 중에 캡처한 부분 실행 데이터를 포함할 수 있습니다.
샤딩되지 않은 컬렉션의 경우 explain
은 다음 executionStats
정보를 반환합니다.
"executionStats" : { "executionSuccess" : <boolean>, "nReturned" : <int>, "executionTimeMillis" : <int>, "totalKeysExamined" : <int>, "totalDocsExamined" : <int>, "executionStages" : { "stage" : <STAGE1> "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, "works" : <int>, "advanced" : <int>, "needTime" : <int>, "needYield" : <int>, "saveState" : <int>, "restoreState" : <int>, "isEOF" : <boolean>, ... "inputStage" : { "stage" : <STAGE2>, "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, ... "inputStage" : { ... } } }, "allPlansExecution" : [ { "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, "totalKeysExamined" : <int>, "totalDocsExamined" :<int>, "executionStages" : { "stage" : <STAGEA>, "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, ... "inputStage" : { "stage" : <STAGEB>, ... "inputStage" : { ... } } } }, ... ] }
샤딩된 컬렉션의 경우 explain
에는 액세스된 각 샤드에 대한 실행 통계가 포함됩니다.
"executionStats" : { "nReturned" : <int>, "executionTimeMillis" : <int>, "totalKeysExamined" : <int>, "totalDocsExamined" : <int>, "executionStages" : { "stage" : <STAGE1> "nReturned" : <int>, "executionTimeMillis" : <int>, "totalKeysExamined" : <int>, "totalDocsExamined" : <int>, "totalChildMillis" : <NumberLong>, "shards" : [ { "shardName" : <string>, "executionSuccess" : <boolean>, "executionStages" : { "stage" : <STAGE2>, "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, ... "chunkSkips" : <int>, "inputStage" : { "stage" : <STAGE3>, ... "inputStage" : { ... } } } }, ... ] } "allPlansExecution" : [ { "shardName" : <string>, "allPlans" : [ { "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, "totalKeysExamined" : <int>, "totalDocsExamined" :<int>, "executionStages" : { "stage" : <STAGEA>, "nReturned" : <int>, "executionTimeMillisEstimate" : <int>, ... "inputStage" : { "stage" : <STAGEB>, ... "inputStage" : { ... } } } }, ... ] }, { "shardName" : <string>, "allPlans" : [ ... ] }, ... ] }
explain.executionStats
우승한 계획에 대해 완료된 쿼리 실행을 설명하는 통계가 포함됩니다. 쓰기 작업의 경우 완료된 쿼리 실행은 수행될 수정을 의미하지만 데이터베이스에 수정 사항을 적용하지는 않습니다.
explain.executionStats.nReturned
성공적인 쿼리 계획이 반환한 문서의 수입니다.
nReturned
는 이전 버전의 MongoDB에서cursor.explain()
이 반환한n
필드에 해당합니다.
explain.executionStats.executionTimeMillis
쿼리 계획 선택과 쿼리 실행에 필요한 총 시간(밀리초 단위)입니다. 여기에는 계획 선택 프로세스의 시험 단계를 실행하는 데 걸리는 시간을 포함하지만, 클라이언트로 데이터를 전송하는 데 걸리는 네트워크 시간은 포함하지 않습니다.
explain.executionStats.executionTimeMillis
에서 보고한 시간이 반드시 실제 쿼리 시간을 나타내는 것은 아닙니다. 정상 상태 작업 중(쿼리 계획이 캐시된 경우) 또는cursor.hint()
을cursor.explain()
와 함께 사용하는 경우, MongoDB는 계획 선택 프로세스를 우회하여 실제 시간을 단축하므로explain.executionStats.executionTimeMillis
값이 더 낮아집니다.
explain.executionStats.totalKeysExamined
스캔한 인덱스 항목 수입니다.
totalKeysExamined
는 이전 버전의 MongoDB에서cursor.explain()
이 반환한nscanned
필드에 해당합니다.
explain.executionStats.totalDocsExamined
쿼리 실행 중에 검토한 문서 수입니다. 문서를 검사하는 일반적인 쿼리 실행 단계는
COLLSCAN
및FETCH
입니다.참고
totalDocsExamined
는 반환된 문서 수가 아닌 검토한 총 문서 수를 나타냅니다. 예를 들어, 스테이지에서는 필터를 적용하기 위해 문서를 검토할 수 있습니다. 문서가 필터링된 경우, 해당 문서는 검토가 완료된 것이며 쿼리 집합의 일부로 반환되지 않습니다.쿼리 실행 중에 문서를 여러 번 검사하는 경우
totalDocsExamined
는 각 검사 횟수를 계산합니다. 즉,totalDocsExamined
는 검토한 고유 문서의 총 수를 포함하지 않습니다.
explain.executionStats.executionStages
성공적인 계획의 완료된 실행을 단계 트리로 자세히 설명합니다. 즉, 단계는 하나의
inputStage
또는 여러 개의inputStages
를 가질 수 있습니다.각 단계는 단계와 관련된 실행 정보로 구성됩니다.
explain.executionStats.executionStages.works
쿼리 실행 단계에서 수행되는 "작업 단위" 수를 지정합니다. 쿼리 실행은 작업을 작은 단위로 나눕니다. "작업 단위"는 단일 인덱스 키를 검사하거나, 컬렉션에서 단일 문서를 가져오거나, 단일 문서에 프로젝션을 적용하거나, 내부 회계 작업을 수행하는 것으로 구성될 수 있습니다.
explain.executionStats.executionStages.needTime
중간 결과를 상위 단계로 진행하지 않은 작업 주기의 수입니다(
explain.executionStats.executionStages.advanced
참조). 예를 들어, 인덱스 스캔 단계는 인덱스 키를 반환하는 대신 인덱스에서 새 위치를 찾는 작업 주기를 보낼 수 있습니다. 이 작업 주기는explain.executionStats.executionStages.advanced
이(가) 아닌explain.executionStats.executionStages.needTime
으)로 계산됩니다
explain.executionStats.executionStages.saveState
쿼리 단계에서 처리를 일시 중단하고 현재 실행 상태를 저장한 횟수입니다(예시: 잠금 양보를 위한 준비).
explain.executionStats.executionStages.restoreState
쿼리 단계에서 저장된 실행 상태를 복원한 횟수입니다(예시: 이전에 생성된 잠금을 복구한 후).
explain.executionStats.executionStages.isEOF
실행 단계가 스트림 종료에 도달했는지 여부를 지정합니다.
true
또는1
이면 실행 단계가 스트림 종료에 도달한 것입니다.false
또는0
인 경우 단계에 반환할 결과가 남아있을 수 있습니다. 예를 들어 실행 단계가 쿼리의 입력 단계가IXSCAN
인LIMIT
단계로 구성된 제한이 있는 쿼리를 가정해 보겠습니다. 쿼리가 지정된 제한보다 많은 값을 반환하는 경우LIMIT
단계는isEOF: 1
을 보고하지만 기본IXSCAN
단계는isEOF: 0
을 보고합니다.
explain.executionStats.executionStages.inputStage.keysExamined
인덱스를 스캔하는 쿼리 실행 단계의 경우(예: IXSCAN)에서
keysExamined
은 인덱스 스캔 프로세스에서 검사되는 인바운드 및 아웃바운드 키의 총 개수입니다. 인덱스 스캔이 단일 연속 키 범위로 구성된 경우 인바운드 키만 검사하면 됩니다. 인덱스 경계가 여러 키 범위로 구성된 경우 인덱스 스캔 실행 프로세스에서 범위를 벗어난 키를 검사하여 한 범위의 끝에서 다음 범위의 시작으로 건너뛸 수 있습니다.x
필드의 인덱스가 있고 collection에x
값이 1 ~ 100 인 100 문서가 포함된 다음 예를 생각해 보겠습니다.db.keys.find( { x : { $in : [ 3, 4, 50, 74, 75, 90 ] } } ).explain( "executionStats" ) 쿼리 는
3
및4
키를 스캔합니다. 그런 다음 키5
을 스캔하여 범위를 벗어난 것을 감지하고 다음 키50
으로 건너뜁니다.이 프로세스를 계속 진행하면서 쿼리는 3, 4, 5, 50, 51, 74, 75, 76, 90 및 91 키를 스캔합니다.
5
,51
,76
및91
키는 여전히 검사되는 범위를 벗어난 키입니다.keysExamined
의 값은 10 입니다.
explain.executionStats.allPlansExecution
채택된 계획과 거부된 계획 모두에 대해 계획 선택 단계에서 캡처한 부분 실행 정보를 포함합니다. 이 필드는
explain
가allPlansExecution
세부 정보 표시 모드에서 실행되는 경우에만 표시됩니다.
파이프라인 단계가 인 쿼리에 대한 $lookup
실행 계획 통계
버전 5.0에 추가.
설명 결과에는 $lookup
파이프라인 단계를 사용하는 쿼리에 대한 실행 통계가 포함될 수 있습니다. 이러한 실행 통계를 포함하려면 다음 실행 상세 모드 중 하나에서 설명 작업을 실행해야 합니다.
다음 필드는 $lookup
쿼리에 대한 Explain 결과에 포함됩니다.
'$lookup': { from: <string>, as: <string>, localField: <string>, foreignField: <string> }, totalDocsExamined: <long>, totalKeysExamined: <long>, collectionScans: <long>, indexesUsed: [ <string_1>, <string_2>, ..., <string_n> ], executionTimeMillisEstimate: <long>
$lookup
섹션의 필드에 대한 설명을 보려면 $lookup
페이지를 참조하십시오.
다른 필드는 다음과 같습니다.
serverInfo
샤딩되지 않은 컬렉션의 경우 explain
은 MongoDB 인스턴스에 대해 다음 serverInfo
정보를 반환합니다.
"serverInfo" : { "host" : <string>, "port" : <int>, "version" : <string>, "gitVersion" : <string> }
샤딩된 컬렉션의 경우 explain
은(는) 액세스된 각 샤드에 대해 serverInfo
을(를) 반환하고 mongos
에 대해 최상위 serverInfo
객체를 반환합니다.
"queryPlanner" : { ... "winningPlan" : { "stage" : <STAGE1>, "shards" : [ { "shardName" : <string>, "connectionString" : <string>, "serverInfo" : { "host" : <string>, "port" : <int>, "version" : <string>, "gitVersion" : <string> }, ... } ... ] } }, "serverInfo" : { // serverInfo for mongos "host" : <string>, "port" : <int>, "version" : <string>, "gitVersion" : <string> } ...
3.0 형식 변경
MongoDB 3.0 부터 explain
결과의 형식과 필드가 이전 버전에서 변경되었습니다. 다음은 몇 가지 주요 차이점입니다.
컬렉션 스캔과 인덱스 사용 비교
쿼리 플래너가 컬렉션 검색을 선택하면 설명 결과에 COLLSCAN
단계가 포함됩니다.
쿼리 플래너가 인덱스를 선택하면 explain 결과에 IXSCAN
단계가 포함됩니다. 이 단계에는 인덱스 키 패턴, 순회 방향, 인덱스 범위 등의 정보가 포함됩니다.
이전 버전의 MongoDB에서 cursor.explain()
은(는) 다음 값이 포함된 cursor
필드를 반환했습니다.
BasicCursor
컬렉션 스캔의 경우BtreeCursor <index name> [<direction>]
인덱스 스캔의 경우.
컬렉션 스캔과 인덱스 스캔의 실행 통계에 대한 자세한 내용은 쿼리 성능 분석을 참조하세요.
지원되는 쿼리
인덱스가 쿼리를 포함하는 경우 MongoDB는 쿼리 조건을 일치시키고 또한 인덱스 키만을 사용하여 결과를 반환할 수 있습니다. MongoDB는 특정 쿼리 부문을 수행하기 위해 컬렉션의 문서를 검사할 필요가 없습니다.
인덱스가 쿼리를 포함하는 경우 설명 결과에는 FETCH
단계의 하위 단계가 아닌 IXSCAN
단계가 있으며 executionStats
에서 totalDocsExamined
는 0
입니다.
이전 버전의 MongoDB 에서는 cursor.explain()
가 indexOnly
필드 를 반환하여 인덱스 가 쿼리 를 포함하는지 여부를 나타냅니다.
인덱스 교차
인덱스 교차 계획 의 경우 결과에는 AND_SORTED
단계 또는 인덱스를 자세히 설명하는 inputStages
배열이 있는 AND_HASH
단계가 포함됩니다. 예:
{ "stage" : "AND_SORTED", "inputStages" : [ { "stage" : "IXSCAN", ... }, { "stage" : "IXSCAN", ... } ] }
이전 버전의 MongoDB에서는 cursor.explain()
이(가) 인덱스 교차에 대해 Complex Plan
값이 포함된 cursor
필드를 반환했습니다.
$or
표현식
MongoDB가 $or
표현식에 인덱스를 사용하는 경우, 결과에는 인덱스를 자세히 설명하는 inputStages
배열이 있는 OR
단계가 포함됩니다. 예:
{ "stage" : "OR", "inputStages" : [ { "stage" : "IXSCAN", ... }, { "stage" : "IXSCAN", ... }, ... ] }
이전 버전의 MongoDB에서는 cursor.explain()
색인을 자세히 설명하는 clauses
배열을 반환했습니다.
$sort
및 $group
단계
explain
이 executionStats 또는 allPlansExecution 세부 정보 표시 모드에서 실행되면 $sort
및 $group
단계에 추가 출력이 있습니다.
정렬 단계
MongoDB가 하나 이상의 인덱스를 사용하여 정렬 순서를 가져올 수 없는 경우 결과에는 차단 정렬 작업을 나타내는 SORT
단계가 포함됩니다. 차단 정렬은 컬렉션이나 데이터베이스에서 동시 작업을 차단하지 않습니다. 이름은 SORT
가 출력 문서를 반환하기 전에 모든 입력 문서를 읽어 해당 특정 쿼리에 대한 데이터 흐름을 차단해야 한다는 요구 사항을 나타냅니다.
MongoDB에서 차단 정렬 작업에 100 메가바이트 이상의 시스템 메모리를 사용해야 하는 경우 쿼리에서 cursor.allowDiskUse()
를 지정하지 않는 한 MongoDB에서 오류를 반환합니다. cursor.allowDiskUse()
를 사용하면 MongoDB가 디스크의 임시 파일을 사용하여 차단 정렬 작업을 처리하는 동안 100 메가바이트 시스템 메모리 제한을 초과하는 데이터를 저장할 수 있습니다. 설명 계획에 명시적인 SORT
단계가 포함되어 있지 않으면 MongoDB는 인덱스를 사용하여 정렬 순서를 얻을 수 있습니다.