Athena EXPLAIN 문 결과 이해 - Amazon Athena

Athena EXPLAIN 문 결과 이해

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

EXPLAIN 문 출력 유형

EXPLAIN 문 출력은 다음 두 유형 중 하나입니다.

  • 논리적 계획(Logical plan) - SQL 엔진이 문을 실행하는 데 사용하는 논리적 계획을 표시합니다. 이 옵션의 구문은 EXPLAIN 또는 EXPLAIN (TYPE LOGICAL)입니다.

  • 배포된 계획(Distributed plan) - 배포된 환경의 실행 계획을 표시합니다. 출력은 처리 단계인 조각들을 보여줍니다. 각 계획 조각은 하나 이상의 노드에서 처리됩니다. 조각을 처리하는 노드 간에는 데이터를 교환할 수 있습니다. 이 옵션의 구문은 EXPLAIN (TYPE DISTRIBUTED)입니다.

    배포된 계획의 출력에서 조각(처리 단계)은 Fragment number [fragment_type]으로 표시됩니다. 여기서 number는 0부터 시작하는 정수이고 fragment_type은 조각이 노드에 의해 실행되는 방식을 지정합니다. 데이터 교환의 레이아웃에 대한 통찰력을 제공하는 조각 유형은 다음 표에 설명되어 있습니다.

    배포된 계획 조각 유형
    조각 유형 설명
    SINGLE 조각이 하나의 노드에서 실행됩니다.
    HASH 조각이 고정된 수의 노드에서 실행됩니다. 입력 데이터가 해시 함수를 사용하여 배포됩니다.
    ROUND_ROBIN 조각이 고정된 수의 노드에서 실행됩니다. 입력 데이터가 라운드 로빈 방식으로 배포됩니다.
    BROADCAST 조각이 고정된 수의 노드에서 실행됩니다. 입력 데이터가 모든 노드에 브로드캐스트됩니다.
    SOURCE 조각이 입력 분할에 액세스되는 노드에서 실행됩니다.

Exchange

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

LocalExchange [exchange_type]

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

RemoteExchange [exchange_type]

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

논리적 교환 유형

다음 교환 유형은 논리적 계획의 교환 단계 중에 수행되는 작업에 대해 설명합니다.

  • GATHER - 하나의 작업자 노드가 다른 모든 작업자 노드로부터 출력을 수집합니다. 예를 들어, select 쿼리의 마지막 단계에서 모든 노드의 결과를 수집하고 결과를 Amazon S3에 기록합니다.

  • REPARTITION - 다음 연산자에 적용하는 데 필요한 분할 스키마를 기반으로 특정 작업자에게 행 데이터를 보냅니다.

  • REPLICATE - 행 데이터를 모든 작업자에게 복사합니다.

배포된 교환 유형

다음 교환 유형은 배포된 계획의 노드 간에 데이터가 교환될 때 데이터의 레이아웃을 나타냅니다.

  • HASH - 교환이 해시 함수를 사용하여 여러 대상에 데이터를 배포합니다.

  • SINGLE - 교환이 하나의 대상에 데이터를 배포합니다.

스캔

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

TableScan

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

ScanFilter

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

ScanFilterProject

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

조인

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

조인 유형

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

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

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

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

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

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

참고

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

조인 배포 유형

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

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

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