

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Redshift 쿼리 계획에 대한 EXPLAIN 연산자
<a name="explain-operators"></a>

이번 섹션에서는 `EXPLAIN` 출력에서 가장 자주 표시되는 연산자에 대해서 간략히 설명합니다.

## 순차 스캔
<a name="sequential-scan"></a>

순차적 스캔 연산자(Seq Scan)는 테이블 스캔을 나타냅니다. Seq Scan이 처음부터 끝까지 테이블의 열을 각각 순차적으로 스캔하고 `WHERE` 절에서 각 행의 쿼리 제약 조건을 평가합니다.

## 조인 연산자
<a name="join-operators"></a>

Amazon Redshift는 조인되는 테이블의 물리적 설계, 조인에 필요한 데이터의 위치, 쿼리 자체의 특정 요건을 기반으로 여러 가지 조인 연산자를 선택합니다.

### 중첩 루프
<a name="join-nested-loop"></a>

중첩 루프는 주로 교차 조인에 사용됩니다. 크로스 조인은 조인 조건이 없기 때문에 두 테이블의 데카르트 곱이 발생하는 원인이 됩니다. 중첩 루프는 일반적으로 중첩 루프 조인으로 실행되기 때문에 가능한 조인 유형 중에서 속도가 가장 느립니다. 중첩 루프가 존재하는 경우 [STL\_ALERT\_EVENT\_LOG](https://docs.aws.amazon.com/redshift/latest/dg/r_STL_ALERT_EVENT_LOG.html)에 중첩 루프 알림 이벤트가 표시될 수 있습니다. 다음 쿼리를 실행하여 중첩 루프가 있는 쿼리를 식별할 수 있습니다.

```
select q.query, 
       trim(q.querytxt) as sql_query, 
       q.starttime 
from stl_query q
join stl_alert_event_log l
    on l.query = q.query
    and l.event like 'Nested Loop Join in the query plan%' 
order by q.starttime desc;
```

### 해시 조인 및 해시
<a name="join-hash"></a>

해시 조인 및 해시 연산자는 일반적으로 중첩 루프 조인보다 빠릅니다. 이러한 연산자는 내부 조인과 왼쪽 및 오른쪽 외부 조인에 대해 사용됩니다. 조인 열이 둘 다 분산 키 및 정렬 키가 아닌 테이블을 조인할 때 해시 조인 및 해시 연산자를 사용할 수 있습니다. 해시 연산자는 조인의 내부 테이블에 대한 해시 테이블을 생성합니다. 해시 조인 연산자는 외부 테이블을 읽고 조인 열을 해시하며 내부 해시 테이블에서 일치하는 항목을 찾습니다.

### 병합 조인
<a name="join-merge"></a>

병합 조인 연산자는 일반적으로 가장 빠른 조인이고, 내부 조인과 외부 조인에 사용됩니다. 병합은 전체 조인에 대해 사용되지 않습니다. 조인 열이 둘 다 분산 키 및 정렬 키인 테이블을 조인할 때 그리고 조인 테이블에서 정렬되지 않은 비율이 20% 미만일 때 병합 조인을 사용할 수 있습니다. 병합 조인 연산자는 정렬된 테이블 2개를 순서대로 읽고 일치하는 행을 찾습니다. 정렬되지 않은 행의 비율을 보려면 [SVV\_TABLE\_INFO](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_TABLE_INFO.html) 시스템 테이블을 쿼리합니다.

## 집계 연산자
<a name="aggregate-operators"></a>

쿼리 계획은 집계 함수 및 `GROUP BY` 작업과 관련된 쿼리에서 다음과 같은 연산자를 사용합니다.
+ **Aggregate** – `AVG`, `SUM` 같은 스칼라 집계 함수에 대한 연산자
+ **HashAggregate** – 정렬되지 않고 그룹화된 집계 함수에 대한 연산자
+ **GroupAggregate** – 정렬되고 그룹화된 집계 함수에 대한 연산자

### 정렬 연산자
<a name="operators-sort"></a>

쿼리 계획은 쿼리가 결과 세트를 정렬하거나 병합해야 할 때 다음과 같은 연산자를 사용합니다.
+ **Sort** – `ORDER BY` 절 및 기타 정렬 작업(예: `UNION` 쿼리 및 조인에 필요한 정렬, `SELECT DISTINCT` 쿼리, 창 함수) 평가
+ **Merge** – 병렬 작업에서 파생된 중간 정렬 결과에 따라 최종 정렬 결과 산출

### UNION, INTERSECT 및 EXCEPT 연산자
<a name="operators-union"></a>

쿼리 계획은 `UNION`, `INTERSECT`, `EXCEPT`를 사용하는 집합 작업과 관련된 쿼리에서 다음과 같은 연산자를 사용합니다.
+ **Subquery** – `UNION` 쿼리를 실행하는 데 사용됨
+ **Hash Intersect Distinct** – `INTERSECT` 쿼리를 실행하는 데 사용됨
+ **SetOp Except** – `EXCEPT` 또는 `MINUS` 쿼리를 실행하는 데 사용됨

### 기타 연산자
<a name="operators-other"></a>

또한 다음과 같은 연산자가 루틴 쿼리의 `EXPLAIN` 출력에 자주 나타납니다.
+ **Unique** – `SELECT DISTINCT` 쿼리 및 `UNION` 쿼리에 대한 중복을 제거합니다.
+ **Limit** – `LIMIT` 절 처리
+ **Window** – 창 함수 실행
+ **Result** – 어떤 테이블 액세스도 관련되지 않는 스칼라 함수 실행
+ **Subplan** – 특정 하위 쿼리에 사용됨
+ **Network** – 추가 처리를 위해 중간 결과를 리더 노드로 전송
+ **Materialize** – 중첩 루프 조인과 일부 병합 조인에 대한 입력을 위한 행 구체화