쿼리 실행 참조

이 페이지에서는 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

고정된 속성 집합에 정렬 작업을 실행합니다. 모든 레코드를 한 번에 메모리에 구체화하고 정렬된 값을 순서대로 반환합니다. 정렬 세트의 크기는 쿼리 메모리 제한에 따라 제한됩니다.

후속 한도가 제공되면 메모리 사용량을 줄이기 위해 상위 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