쿼리 계획 및 실행 워크플로우
다음 그림은 쿼리 계획 및 실행 워크플로우를 종합적으로 도식한 것입니다.
쿼리 계획 및 실행 워크플로우는 다음과 같은 단계로 구성됩니다.
-
리더 노드가 쿼리를 수신하고 SQL 구문을 분석합니다.
-
구문 분석기가 원래 쿼리에 대한 논리적 표현인 초기 쿼리 트리를 생성합니다. 그런 다음 Amazon Redshift는 이 쿼리 트리를 쿼리 옵티마이저에 입력합니다.
-
옵티마이저가 평가를 거쳐 필요하다고 판단되면 쿼리를 재작성하여 효율성을 극대화합니다. 이 프로세스는 간혹 관련 쿼리를 다수 생성하여 단일 쿼리를 대체하기도 합니다.
-
옵티마이저가 성능을 극대화하는 쿼리 실행 계획(이전 단계에서 다수의 쿼리를 생성한 경우에는 쿼리 실행 계획들)을 작성합니다. 쿼리 계획이 조인 유형, 조인 순서, 집계 옵션, 데이터 분산 요건 등 실행 옵션을 지정합니다.
EXPLAIN 명령을 사용하면 쿼리 계획을 확인할 수 있습니다. 쿼리 계획은 복합 쿼리를 분석하여 튜닝할 수 있는 기본 도구입니다. 자세한 내용은 쿼리 계획 생성 및 해석 섹션을 참조하세요.
-
실행 엔진이 쿼리 계획을 단계, 세그먼트 및 스트림으로 변환합니다.
- 단계
-
각 단계는 쿼리 실행 시 필요한 개별 작업을 의미합니다. 컴퓨팅 노드는 이러한 단계들을 조합하여 쿼리, 조인 또는 기타 데이터베이스 작업 등을 실행할 수 있습니다.
- 세그먼트
-
단일 프로세스에서 실행할 수 있는 몇몇 단계들의 조합인 동시에 컴퓨팅 노드 조각에서 실행할 수 있는 가장 작은 컴파일 유닛입니다. 여기서 조각이란 Amazon Redshift의 병렬 처리 유닛을 말합니다. 스트림을 구성하는 세그먼트들은 병렬로 실행됩니다.
- 스트림
-
사용 가능한 컴퓨팅 노드 조각 위로 분할되는 세그먼트 집합입니다.
실행 엔진은 단계, 세그먼트 및 스트림을 기준으로 컴파일 코드를 작성합니다. 컴파일 코드는 인터프리터 코드보다 실행 속도가 빠르고 사용하는 컴퓨팅 용량도 적습니다. 이렇게 작성된 컴파일 코드는 컴퓨팅 노드로 브로드캐스팅됩니다.
참고
쿼리를 벤치마킹할 때는 항상 두 번째 쿼리의 실행 시간을 비교해야 합니다. 첫 번째 쿼리의 실행 시간에는 코드를 컴파일하는 오버헤드가 포함되기 때문입니다. 자세한 내용은 쿼리 성능에 영향을 미치는 요인 섹션을 참조하세요.
-
컴퓨팅 노드 조각이 쿼리 세그먼트를 병렬 방식으로 실행합니다. 이때 Amazon Redshift는 최적화된 네트워크 통신, 메모리 및 디스크 관리를 활용하여 한 쿼리 계획 단계의 중간 결과를 다음 쿼리 계획 단계로 전달합니다. 이는 쿼리 실행 속도를 높이는 데도 유용합니다.
5단계와 6단계는 각 스트림마다 한 번씩 일어납니다. 엔진은 스트림마다 실행 가능한 세그먼트를 생성하여 컴퓨팅 노드로 전송합니다. 이렇게 스트림 하나의 세그먼트가 완료되면 다음 스트림을 위한 세그먼트가 엔진에서 생성됩니다. 이러한 방식으로 엔진은 이전 스트림의 작업 내용(작업의 디스크 기반 여부 등)을 분석하여 다음 스트림의 세그먼트 생성에도 영향을 미칩니다.
컴퓨팅 노드에서 작업을 마치면 최종 처리를 위해 쿼리 결과를 다시 리더 노드로 보냅니다. 리더 노드는 수신되는 데이터를 단일 결과 집합으로 병합하여 필요에 따라 정렬 또는 집계를 실행합니다. 그런 다음 결과를 클라이언트에게 돌려보냅니다.
참고
컴퓨팅 노드는 쿼리 실행 도중 필요에 따라 일부 데이터를 리더 노드로 다시 보낼 수도 있습니다. 예를 들어 LIMIT 절에 하위 쿼리가 있는 경우에는 리더 노드에 먼저 제한이 적용된 후에 데이터가 추가 처리를 위해 클러스터로 재분산됩니다.