쿼리 실행 참조

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

일반적인 개념

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

행 및 레코드

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

변수

$는 실행 트리에서 생성되거나 참조되는 변수를 나타냅니다. 예를 들면 $foo_1입니다. 이러한 변수는 일반적으로 문서의 콘텐츠나 쿼리 실행 중에 평가된 표현식의 값을 참조하는 데 사용됩니다.

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

  • $__key__: 키는 문서의 내부 식별자입니다. 프로젝트, 데이터베이스, 문서의 전체 경로가 포함된 절대 고유 식별자입니다.
  • $__id__: ID는 컬렉션 내 문서의 고유 식별자입니다. 단일 컬렉션 내에서 고유합니다.

Compute 노드를 사용하여 문서 __key__에서 __id__를 계산하는 예를 살펴보겠습니다.

Compute
    |  $__id__1: _id($__key__)
    |  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 필드 값은 변수 $user_1에 매핑되고 date_placed 값은 $date_placed_1에 매핑됩니다.

index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __key__ ASC]
keys: [user ASC, date_placed ASC, __key__ 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: [user ASC, quantity 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: [user ASC, date_placed 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: [user ASC, date_placed 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

LookupById

ID로 외래 컬렉션의 문서를 조회하여 조인을 수행합니다. 조회할 ID는 입력 문서의 필드에서 가져옵니다. 조회 결과는 입력 문서에 새 필드로 추가됩니다.

• LookupById
|  local_field: $localField_1
|  foreign_datasource: (default)#/**/foreign
|  output: $output_1

TableScan

컬렉션의 순서가 지정되지 않은 전체 스캔입니다. 연결된 색인 없이 쿼리를 실행할 때 사용됩니다.

순서는 STABLE 또는 UNDEFINED일 수 있으며, STABLE은 결정적 순서를 나타냅니다.

• TableScan
|  order: STABLE
|  properties: *
|  records returned: 1
|  records scanned: 1
|  source: (default)#/**/collection

HashAggregate

집계 작업의 해시 지원 구현입니다. 결과를 반환하기 전에 전체 그룹을 인메모리에 구체화해야 하며 쿼리 메모리 한도를 초과해서는 안 됩니다.

• HashAggregate
|  aggregations: [sum($b_1) AS total]
|  groups: [$a_1]
|  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_1) 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

컴퓨팅

표현식 집합을 평가하여 결과를 변수 집합에 할당합니다.

• Compute
|  $user_1: user
|  $full_name_1: str_concat($first_name_1, " ", $last_name_1)
|  $address_1: UNSET
|  records returned: 1

필터

제공된 표현식과 일치하는 경우에만 행을 선택적으로 반환합니다.

• Filter
|  expression: $eq(foo, "bar")
|  records returned: 1

작업할 리터럴 값의 시퀀스를 생성합니다. 주로 문서 목록이 쿼리의 입력으로 제공될 때 사용됩니다.

• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]

Unnest

하위 노드에서 생성된 값을 중첩 해제합니다.

• Unnest
|  expression: foo AS unnested_foo

한도

상위 노드로 반환되는 행 수를 제한합니다.

• Limit
|  limit: 10
|  records returned: 1

오프셋

하위 노드에서 생성된 행을 지정된 수만큼 건너뜁니다.

• Offset
|  offset: 10
|  records returned: 1