쿼리 실행 참조
이 페이지에서는 Query Explain으로 실행된 쿼리의 출력을 설명합니다. 쿼리 설명으로 쿼리를 실행하는 방법을 알아보려면 쿼리 설명으로 쿼리 실행 분석을 참고하세요.일반적인 개념
다음 일반적인 개념과 용어는 실행 트리 전체에서 사용됩니다.
행 및 레코드
행 및 레코드라는 용어는 문서 또는 색인 항목을 일반적으로 지칭하는 데 사용됩니다.
변수
실행 노드에는 다음 내부 변수가 표시될 수 있습니다.
__key__
- 키는 문서의 내부 식별자입니다. 프로젝트, 데이터베이스, 문서의 전체 경로가 포함된 절대 고유 식별자입니다.__id__
: ID는 컬렉션 내 문서의 고유 식별자입니다. 단일 컬렉션 내에서 고유합니다.__$0__…__$N__
- 실행 트리에서 생성되거나 참조되는 컨텍스트별 변수입니다. 이러한 변수는 일반적으로 문서의 콘텐츠나 쿼리 실행 중에 평가된 표현식의 값을 참조하는 데 사용됩니다.
확장 노드를 사용하여 문서 __key__
에서 __id__
를 추출하는 예를 살펴보겠습니다.
Extend
| expressions: [_id(__key__) AS __id__]
| records returned: 1
제약 조건 및 범위
일부 스캔 노드는 constraints
및 ranges
속성을 사용하여 스캔되는 값의 범위를 설명합니다. 이러한 속성은 값 목록이 포함된 범위 트리 형식을 사용합니다. 이러한 값은 색인 정의에 표시되는 키의 정렬된 목록에 해당합니다. 예를 들어 트리에 표시되는 첫 번째 범위(여기서는 (1..5]
)는 정렬된 키 목록에 있는 첫 번째 키(여기서는 a
)의 제약 조건에 해당합니다.
| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
|----(1..5]
|----[1L]
각 들여쓰기 수준은 목록의 다음 키에 적용되는 제약 조건을 나타냅니다. 대괄호는 포함된 범위를 나타내고 둥근 괄호는 제외된 범위를 나타냅니다. 이 경우 제약 조건은 1 < "a" <= 5
및 "b" = 1
로 변환됩니다.
a
에 여러 분기가 있는 다음 예에서 제약 조건은 1 < a <= 5 OR a = 10
에 해당합니다.
| constraints: /
|----(1L, 5L]
|----[10L]
주요 변수
일부 스캔 노드 (예: SequentialScan
)에는 index
속성의 일부로 키 목록이 있고 Scan
노드에 별도의 keys
속성이 있습니다. Scan
노드의 keys
속성은 색인 정의에 있는 각 키의 변수 이름을 순서대로 나타냅니다. 변수를 사용하여 실행 트리에서 더 위로 스캔된 필드의 런타임 값을 참조할 수 있습니다.
다음 예시에서 현재 문서의 user
필드 값은 변수 __$6__
에 매핑되고 date_placed
값은 __$7__
에 매핑됩니다.
index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __path__ ASC]
keys: [__$6__ ASC, __$7__ ASC, __path__ ASC]
실행 노드
쿼리 실행 트리에는 다음 노드가 포함될 수 있습니다.
SeekingScan
반환된 행이 색인의 단일 순차적 범위에 있지 않을 수 있으며 쿼리를 충족하기 위해 여러 개의 개별 스캔을 실행해야 하는 동적 스캔을 나타냅니다.
예를 들어 a
이 존재하고 b
이 1인 쿼리가 ["a" ASC, "b" ASC]
의 색인에서 작동하는 경우 a
의 각 고유 값에 대해 별도의 잠재적으로 비순차적 범위를 스캔하고 반환해야 합니다.
이는 전체 TableScan
보다 효율적이지만 ["b" ASC, "a" ASC]
의 복합 색인에 있는 단일 SequentialScan
보다는 효율성이 떨어집니다.
• SeekingScan
| constraints: /
|----(-∞..+∞)
|----[1L]
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, quantity ASC, __key__ ASC]
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1
SequentialScan
단일 읽기 작업으로 실행할 수 있는 저장소의 정적이고 순차적인 행 범위를 나타냅니다.
key ordering length
는 원래 키 순서로 유지되고 반환되어야 하는 키 수를 나타냅니다. [k1, k2, k3]
스키마의 경우 키 정렬 길이가 0이면 스캔이 어떤 순서로든 반환될 수 있고, 1이면 k1으로 정렬되지만 동일한 k1 값을 가진 행은 어떤 순서로든 올 수 있으며, 3은 정확한 정렬 순서로 문서를 반환합니다.
• SequentialScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| key ordering length: 3
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1
UniqueScan
행의 메모리 내 중복 삭제를 사용하여 스토리지에서 정적이고 순차적인 행 범위를 검색하는 것을 나타냅니다.
• UniqueScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
|----(-∞..+∞)
| records returned: 1
| records scanned: 1
TableAccess
제공된 행의 식별자를 기본 저장소의 실제 행 콘텐츠에 다시 조인합니다. 상위 노드 (또는 최종 쿼리 결과)에 문서의 필드 하위 집합이 필요한 경우 TableAccess
이 필요합니다.
• TableAccess
| order: PRESERVE_INPUT_ORDER
| peak memory usage: 4.00 KiB (4,096 B)
| properties: *
| records returned: 1
TableScan
컬렉션의 전체 무질서 스캔입니다. 연결된 색인 없이 쿼리를 실행할 때 사용됩니다.
순서는 STABLE
또는 UNDEFINED
일 수 있으며, STABLE
은 결정적 순서를 나타냅니다.
• TableScan
| order: STABLE
| properties: *
| records returned: 1
| records scanned: 1
| source: (default)#/**/collection
HashAggregate
집계 작업의 해시 지원 구현입니다. 결과를 반환하기 전에 전체 그룹을 메모리에 구체화해야 하며 쿼리 메모리 한도를 초과해서는 안 됩니다.
• HashAggregate
| aggregations: [sum(__$0__) AS total]
| groups: [a]
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 0
StreamAggregate
한 번에 하나의 그룹의 상태만 유지하여 최대 메모리 사용량을 줄이는 특수 집계 노드 기본 하위 노드가 그룹을 순차적으로 반환하는 경우 사용됩니다. 예를 들어 필드에 색인을 사용하는 동안 필드의 고유 값으로 그룹화하는 경우입니다.
• StreamAggregate
| keys: [foo ASC, bar ASC]
| properties: Selection { baz }
| aggregations: [$sum(foo) AS baz]
MajorSort
고정된 속성 집합에 정렬 작업을 실행합니다. 모든 레코드를 한 번에 메모리에 구체화하고 정렬된 값을 순서대로 반환합니다. 정렬 세트의 크기는 쿼리 메모리 제한에 따라 제한됩니다.
후속 한도가 제공되면 메모리 사용량을 줄이기 위해 상위 k 정렬 알고리즘이 사용됩니다. 이를 사용하면 고려된 k 요소의 저장에 사용되는 메모리가 한도를 초과하지 않는 한 임의로 큰 레코드 집합에서 정렬을 실행할 수 있습니다.
• MajorSort
| fields: [a ASC, b DESC]
| limit: 10
| peak memory usage: 4.00 KiB (4,096 B)
| records returned: 1
Concat
여러 하위 노드의 결과를 연결하고 결과를 상위 노드에 반환합니다. 이 노드는 여러 하위 요소에 표시되는 결과를 중복 삭제하지 않으며 반환된 결과의 순서는 비결정적입니다.
• Concat
├── • TableAccess
...
├── • TableAccess
제한
상위 노드에 전달할 속성 집합을 투영합니다. 쿼리의 나머지 부분과 관련이 없어지면 사용되지 않는 필드의 전파를 방지하여 메모리 사용량을 줄입니다.
• Restrict
| expressions: [foo AS foo, bar AS bar]
| records returned: 0
연장
결과 집합의 각 행에 필드 집합을 추가합니다. 문서에 필드를 추가할 때 사용되며 더 복잡한 작업을 지원하는 중간 노드로 사용됩니다.
• Extend
| expressions: ["bar" AS foo]
| records returned: 1
필터
제공된 표현식과 일치하는 경우에만 행을 선택적으로 반환합니다.
• Filter
| expression: $eq(foo, "bar")
| records returned: 1
값
작업할 리터럴 값의 시퀀스를 생성합니다. 주로 문서 목록이 쿼리의 입력으로 제공될 때 사용됩니다.
• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]
ReplaceWith
하위 노드에서 생성된 행의 필드를 제공된 map
표현식의 필드로 바꿉니다.
• ReplaceWith
| map: map("full_name", str_concat(first_name, " ", last_name)), current_context())
| records returned: 1
Unnest
하위 노드에서 생성된 값을 중첩 해제합니다.
• Unnest
| expression: foo AS unnested_foo
한도
상위 노드로 반환되는 행 수를 제한합니다.
• Limit
| limit: 10
| records returned: 1
오프셋
하위 노드에서 생성된 행을 지정된 수만큼 건너뜁니다.
• Offset
| offset: 10
| records returned: 1
삭제
하위 노드에서 생성된 결과에서 지정된 필드 집합을 삭제합니다.
• Drop
| fields to drop: [__key__]
| records returned: 1