쿼리 실행 참조

이 페이지에서는 Query Explain으로 실행된 쿼리의 출력을 설명합니다. 쿼리 설명을 사용하여 쿼리를 실행하는 방법은 쿼리 설명을 사용하여 쿼리 실행 분석을 참고하세요.

일반적인 개념

다음과 같은 일반적인 개념과 용어는 실행 트리 전체에 걸쳐 사용됩니다.

행 및 레코드

레코드라는 용어는 문서 또는 색인 항목을 일반적으로 참조하는 데 사용됩니다.

변수

실행 노드에 다음과 같은 내부 변수가 표시될 수 있습니다.

  • __key__: 키는 문서의 내부 식별자입니다. 프로젝트, 데이터베이스, 문서의 전체 경로가 포함된 절대 고유 식별자입니다.
  • __id__: ID는 컬렉션 내 문서의 고유 식별자입니다. 단일 컬렉션 내에서 고유합니다.
  • __$0__…__$N__: 실행 트리에서 생성되거나 참조되는 컨텍스트별 변수입니다. 이러한 변수는 일반적으로 문서의 콘텐츠 또는 쿼리 실행 중에 평가된 표현식의 값을 참조하는 데 사용됩니다.

확장 노드를 사용하여 문서 __key__에서 __id__를 추출하는 예를 살펴보겠습니다.

Extend
    |  expressions: [_id(__key__) AS __id__]
    |  records returned: 1

제약조건 및 범위

일부 스캔 노드는 constraintsranges 속성을 사용하여 스캔되는 값의 범위를 설명합니다. 이러한 속성은 값 목록이 포함된 범위 트리 형식을 사용합니다. 이 값은 색인 정의에 표시되는 순서가 지정된 키 목록에 해당합니다. 예를 들어 트리에 표시되는 첫 번째 범위(여기서는 (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