쿼리 실행 참조
이 페이지에서는 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
고정된 속성 집합에 정렬 작업을 실행합니다. 메모리에 있는 모든 레코드를 한 번에 구체화하고 정렬된 값을 순서대로 반환합니다. 정렬 집합의 크기는 쿼리 메모리 제한에 의해 제한됩니다.
후속 한도가 제공되면 메모리 사용량을 줄이기 위해 top-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