

# Athena EXPLAIN 문 결과 이해
<a name="athena-explain-statement-understanding"></a>

이 주제에서는 Athena `EXPLAIN` 문 결과에 사용되는 연산 용어에 대한 간략한 안내를 제공합니다.

## EXPLAIN 문 출력 유형
<a name="athena-explain-statement-understanding-explain-plan-types"></a>

`EXPLAIN` 문 출력은 다음 두 유형 중 하나입니다.
+ **논리적 계획(Logical plan)** - SQL 엔진이 문을 실행하는 데 사용하는 논리적 계획을 표시합니다. 이 옵션의 구문은 `EXPLAIN` 또는 `EXPLAIN (TYPE LOGICAL)`입니다.
+ **배포된 계획(Distributed plan)** - 배포된 환경의 실행 계획을 표시합니다. 출력은 처리 단계인 조각들을 보여줍니다. 각 계획 조각은 하나 이상의 노드에서 처리됩니다. 조각을 처리하는 노드 간에는 데이터를 교환할 수 있습니다. 이 옵션의 구문은 `EXPLAIN (TYPE DISTRIBUTED)`입니다.

  배포된 계획의 출력에서 조각(처리 단계)은 `Fragment` *number* [*fragment\$1type*]으로 표시됩니다. 여기서 *number*는 0부터 시작하는 정수이고 *fragment\$1type*은 조각이 노드에 의해 실행되는 방식을 지정합니다. 데이터 교환의 레이아웃에 대한 통찰력을 제공하는 조각 유형은 다음 표에 설명되어 있습니다.  
**배포된 계획 조각 유형**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/athena-explain-statement-understanding.html)

## Exchange
<a name="athena-explain-statement-understanding-exchange-types"></a>

교환 관련 용어는 작업자 노드 간에 데이터가 교환되는 방식을 설명합니다. 전송은 로컬 또는 원격일 수 있습니다.

**LocalExchange [*exchange\$1type*] **  
쿼리의 여러 단계에 대해 작업자 노드 내에서 로컬로 데이터를 전송합니다. *exchange\$1type*의 값은 이 단원의 뒤에서 설명한 대로 논리적 교환 또는 배포된 교환 유형 중 하나일 수 있습니다.

**RemoteExchange [*exchange\$1type*] **  
쿼리의 여러 단계에 대해 작업자 노드 간에 데이터를 전송합니다. *exchange\$1type*의 값은 이 단원의 뒤에서 설명한 대로 논리적 교환 또는 배포된 교환 유형 중 하나일 수 있습니다.

### 논리적 교환 유형
<a name="athena-explain-statement-understanding-exchange-types-logical"></a>

다음 교환 유형은 논리적 계획의 교환 단계 중에 수행되는 작업에 대해 설명합니다.
+ **`GATHER`** - 하나의 작업자 노드가 다른 모든 작업자 노드로부터 출력을 수집합니다. 예를 들어, select 쿼리의 마지막 단계에서 모든 노드의 결과를 수집하고 결과를 Amazon S3에 기록합니다.
+ **`REPARTITION`** - 다음 연산자에 적용하는 데 필요한 분할 스키마를 기반으로 특정 작업자에게 행 데이터를 보냅니다.
+ **`REPLICATE`** - 행 데이터를 모든 작업자에게 복사합니다.

### 배포된 교환 유형
<a name="athena-explain-statement-understanding-exchange-types-distributed"></a>

다음 교환 유형은 배포된 계획의 노드 간에 데이터가 교환될 때 데이터의 레이아웃을 나타냅니다.
+ **`HASH`** - 교환이 해시 함수를 사용하여 여러 대상에 데이터를 배포합니다.
+ **`SINGLE`** - 교환이 하나의 대상에 데이터를 배포합니다.

## 스캔
<a name="athena-explain-statement-understanding-scanning"></a>

다음 용어는 쿼리 중에 데이터를 스캔하는 방식을 설명합니다.

**TableScan **  
Amazon S3 또는 Apache Hive 커넥터에서 온 테이블의 소스 데이터를 스캔하고 필터 조건자로부터 발생된 파티션 정리를 적용합니다.

**ScanFilter **  
Amazon S3 또는 Apache Hive 커넥터에서 온 테이블의 소스 데이터를 스캔하고 필터 조건자 및 파티션 정리 전반에 적용되지 않은 추가 필터 조건자로부터 발생된 파티션 정리를 적용합니다.

**ScanFilterProject **  
먼저 Amazon S3 또는 Apache Hive 커넥터에서 온 테이블의 소스 데이터를 스캔하고 필터 조건자 및 파티션 정리 전반에 적용되지 않은 추가 필터 조건자로부터 발생된 파티션 정리를 적용합니다. 그런 다음 출력 데이터의 메모리 레이아웃을 새로운 프로젝션으로 수정하여 후속 단계의 성능을 향상시킵니다.

## 조인
<a name="athena-explain-statement-understanding-join"></a>

두 테이블 간에 데이터를 조인합니다. 조인은 조인 유형 및 배포 유형별로 범주화할 수 있습니다.

### 조인 유형
<a name="athena-explain-statement-understanding-join-types"></a>

조인 유형은 조인 작업이 발생하는 방식을 정의합니다.

**CrossJoin** - 조인된 두 테이블의 데카르트 곱을 산출합니다.

**InnerJoin** - 두 테이블에서 일치하는 값을 가진 레코드를 선택합니다.

**LeftJoin** - 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 선택합니다. 일치하는 항목이 없으면 오른쪽의 결과는 NULL입니다.

**RightJoin** - 오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 선택합니다. 일치하는 항목이 없으면 왼쪽의 결과는 NULL입니다.

**FullJoin** - 왼쪽 또는 오른쪽 테이블 레코드에서 일치항목이 있는 모든 레코드를 선택합니다. 조인된 테이블에는 두 테이블의 모든 레코드가 포함되며 양쪽에서 누락된 일치 항목에 대해서는 NULL을 채웁니다.

**참고**  
성능상의 이유로 쿼리 엔진은 조인 쿼리를 다른 조인 유형으로 다시 작성하여 같은 결과를 낼 수 있습니다. 예를 들어, 하나의 테이블에 조건자가 있는 내부 조인 쿼리는 `CrossJoin`으로 다시 작성할 수 있습니다. 이렇게 하면 조건자가 테이블의 스캔 단계로 푸시다운되어 더 적은 데이터가 검색됩니다.

### 조인 배포 유형
<a name="athena-explain-statement-understanding-join-distribution-types"></a>

배포 유형은 조인 작업이 수행될 때 작업자 노드 간에 데이터가 교환되는 방식을 정의합니다.

**분할식(Partitioned)** - 왼쪽 테이블과 오른쪽 테이블이 모든 작업자 노드에서 모두 해시 분할됩니다. 분할식 배포는 각 노드에서 더 적은 메모리를 소비합니다. 분할된 배포는 복제된 조인보다 훨씬 느릴 수 있습니다. 두 개의 큰 테이블을 조인할 때 분할식 조인이 적합합니다.

**복제식(Replicated)**- 조인 작업을 수행하기 위해 한 테이블은 모든 작업자 노드에서 해시 분할되고 다른 테이블은 모든 작업자 노드에 복제됩니다. 복제식 배포는 분할식 조인보다 훨씬 빠를 수 있지만 각 작업자 노드에서 더 많은 메모리를 소비합니다. 복제된 테이블이 너무 크면 작업자 노드에서 메모리 부족 오류가 발생할 수 있습니다. 조인된 테이블 중 하나가 작은 경우 복제식 조인이 적합합니다.