EXPLAIN - Amazon Redshift

EXPLAIN

쿼리를 실행하지 않고 쿼리 문에 대한 실행 계획을 표시합니다. 쿼리 분석 워크플로에 대한 자세한 내용은 쿼리 분석 워크플로우 섹션을 참조하세요.

구문

EXPLAIN [ VERBOSE ] query

파라미터

상세 표시

단순한 요약 대신 전체 쿼리 계획을 표시합니다.

query

설명할 쿼리 문입니다. 쿼리는 SELECT, INSERT, CREATE TABLE AS, UPDATE 또는 DELETE 문일 수 있습니다.

사용 노트

EXPLAIN 성능은 때때로 임시 테이블 생성에 걸리는 시간의 영향을 받습니다. 예를 들어, 공통 하위 표현식 최적화를 사용하는 쿼리는 EXPLAIN 출력을 반환하기 위해 임시 테이블을 생성하고 분석해야 합니다. 쿼리 계획은 임시 테이블의 스키마와 통계에 따라 다릅니다. 따라서 이 유형의 쿼리에 대한 EXPLAIN 명령 실행 시간은 예상보다 길 수 있습니다.

다음 명령에만 EXPLAIN을 사용할 수 있습니다.

  • SELECT

  • SELECT INTO

  • CREATE TABLE AS

  • INSERT

  • UPDATE

  • DELETE

EXPLAIN 명령을 DDL(데이터 정의 언어) 또는 데이터베이스 작업 등의 다른 SQL 명령에 사용할 경우 실패하게 됩니다.

EXPLAIN 출력 상대 단위 비용은 Amazon Redshift에서 쿼리 계획을 선택하는 데 사용됩니다. Amazon Redshift는 다양한 리소스 추정치의 크기를 비교하여 계획을 결정합니다.

쿼리 계획 및 실행 단계

특정 Amazon Redshift 쿼리 문에 대한 실행 계획은 쿼리의 실행과 계산을 별개의 단계 순서와 테이블 작업으로 분리하며, 결국은 쿼리에 대한 최종 결과 집합을 생성하게 됩니다. 쿼리 계획에 대한 자세한 내용은 쿼리 처리 섹션을 참조하세요.

다음 표에는 Amazon Redshift에서 사용자가 실행을 위해 제출하는 쿼리를 위한 실행 계획을 개발하는 데 사용할 수 있는 단계가 요약되어 있습니다.

EXPLAIN 연산자 쿼리 실행 단계 설명
스캔:
순차 스캔 스캔 Amazon Redshift 관계 스캔 또는 테이블 스캔 연산자 또는 단계입니다. 전체 테이블을 처음부터 끝까지 순차적으로 스캔합니다. 또한, WHERE 절과 함께 지정된 경우 모든 행에 대한 쿼리 제약 조건을 평가합니다(Filter). INSERT, UPDATE 및 DELETE 문의 실행에도 사용됩니다.
JOINS: Amazon Redshift는 조인되는 테이블의 물리적 설계, 조인에 필요한 데이터의 위치, 쿼리 자체의 특정 속성을 기반으로 여러 가지 조인 연산자를 사용합니다. 하위 쿼리 스캔 -- 하위 쿼리 스캔 및 추가는 UNION 쿼리 실행에 사용됩니다.
중첩 루프 nloop 가장 덜 최적화된 조인으로, 주로 크로스 조인(조인 조건이 없는 데카르트 곱)과 일부 부등식 조인에 사용됩니다.
해시 조인 hjoin 내부 조인과 왼쪽 및 오른쪽 외부 조인에도 사용되며 일반적으로 중첩 루프 조인보다 빠릅니다. 해시 조인은 외부 테이블을 읽고 조인 열을 해시하고 내부 해시 테이블에서 일치하는 항목을 찾습니다. 단계가 디스크로 분산될 수 있습니다. (hjoin의 내부 입력은 디스크를 기반으로 할 수 있는 해시 단계입니다.)
병합 조인 mjoin 내부 조인과 외부 조인에도 사용됩니다(조인 열에서 배포 및 정렬이 모두 이루어지는 조인 테이블의 경우). 일반적으로 다른 비용 고려 사항은 포함하지 않은 가장 빠른 Amazon Redshift 조인 알고리즘입니다.
AGGREGATION: 집계 함수 및 GROUP BY 작업과 관련된 쿼리에 사용되는 연산자와 단계입니다.
집계 aggr 스칼라 집계 함수를 위한 연산자/단계입니다.
HashAggregate aggr 그룹화된 집계 함수를 위한 연산자/단계입니다. 해시 테이블이 디스크로 분산된 덕분에 디스크에서 작동할 수 있습니다.
GroupAggregate aggr force_hash_grouping 설정을 위한 Amazon Redshift 구성 설정이 해제된 경우 그룹화된 집계 쿼리를 위해 때때로 선택되는 연산자입니다.
SORT: 쿼리가 결과 집합을 정렬하거나 병합해야 할 때 사용되는 연산자와 단계입니다.
정렬 정렬 Sort는 ORDER BY 절에 의해 지정된 정렬은 물론이고, UNION 및 조인 등의 기타 작업에 의해 지정된 정렬도 수행합니다. 디스크에서 작동할 수 있습니다.
병합 merge 병렬로 수행되는 작업에서 파생된, 즉시 정렬된 결과를 바탕으로 쿼리의 최종 정렬 결과를 생성합니다.
EXCEPT, INTERSECT 및 UNION 작업:
SetOp Except [Distinct] hjoin EXCEPT 쿼리에 사용됩니다. 입력 해시가 디스크를 기반으로 할 수 있다는 사실의 이점을 바탕으로 디스크에서 작동할 수 있습니다.
Hash Intersect [Distinct] hjoin INTERSECT 쿼리에 사용됩니다. 입력 해시가 디스크를 기반으로 할 수 있다는 사실의 이점을 바탕으로 디스크에서 작동할 수 있습니다.
Append [All |Distinct] 저장 UNION 및 UNION ALL 쿼리를 구현하기 위해 Subquery Scan과 함께 사용되는 Append입니다. "save"의 이점을 바탕으로 디스크에서 작동할 수 있습니다.
기타:
Hash hash 내부 조인과 왼쪽 및 오른쪽 외부 조인도 사용됩니다(해시 조인에 대한 입력 제공). Hash 연산자는 조인의 내부 테이블에 대한 해시 테이블을 생성합니다. (내부 테이블은 일치 여부가 검사되는 테이블이며, 두 테이블이 조인된 경우에는 보통 둘 중 더 작은 테이블입니다.)
Limit 제한 LIMIT 절을 평가합니다.
Materialize 저장 중첩 루프 조인과 일부 병합 조인에 대한 입력을 위한 행을 구체화합니다. 디스크에서 작동할 수 있습니다.
-- parse 로드 중에 텍스트 입력 데이터를 구문 분석하는 데 사용됩니다.
-- project 열 및 컴퓨팅 표현식, 즉 프로젝트 데이터를 다시 배치하는 데 사용됩니다.
Result -- 어떤 테이블 액세스도 관련되지 않는 스칼라 함수를 실행합니다.
-- return 리더 또는 클라이언트로 행을 반환합니다.
Subplan -- 특정 하위 쿼리에 사용됩니다.
고유 고유 SELECT DISTINCT 및 UNION 쿼리에서 중복을 제거합니다.
Window 집계 및 순위 창 함수를 계산합니다. 디스크에서 작동할 수 있습니다.
네트워크 운영:
네트워크(브로드캐스트) bcast 브로드캐스트는 Join Explain 연산자와 단계의 속성이기도 합니다.
네트워크(배포) dist 데이터 웨어하우스 클러스터에 의한 병렬 처리를 위한 컴퓨팅 노드로 행을 배포합니다.
네트워크(리더로 보내기) return 추가적인 처리를 위해 리더로 결과를 다시 보냅니다.
DML 작업(데이터를 수정하는 연산자):
삽입(결과 사용) 삽입 데이터를 삽입합니다.
삭제(스캔 + 필터) 삭제 데이터를 삭제합니다. 디스크에서 작동할 수 있습니다.
업데이트(스캔 + 필터) delete, insert 삭제 및 삽입으로 구현됩니다.

RLS에 EXPLAIN 사용

쿼리에 행 수준 보안(RLS) 정책이 적용되는 테이블이 포함되어 있는 경우 EXPLAIN은 특별한 RLS SecureScan 노드를 표시합니다. 또한 Amazon Redshift는 STL_EXPLAIN 시스템 테이블에 동일한 노드 유형을 로깅합니다. EXPLAIN은 dim_tbl에 적용되는 RLS 조건자를 표시하지 않습니다. RLS SecureScan 노드 유형은 현재 사용자에게 보이지 않는 추가 작업이 실행 계획에 포함되어 있음을 나타내는 표시자로 사용됩니다.

다음 예는 RLS SecureScan 노드를 보여줍니다.

EXPLAIN SELECT D.cint FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k WHERE F.k_dim / 10 > 0; QUERY PLAN ------------------------------------------------------------------------ XN Hash Join DS_DIST_ALL_NONE (cost=0.08..0.25 rows=1 width=4) Hash Cond: ("outer".k_dim = "inner"."k") -> *XN* *RLS SecureScan f (cost=0.00..0.14 rows=2 width=4)* Filter: ((k_dim / 10) > 0) -> XN Hash (cost=0.07..0.07 rows=2 width=8) -> XN Seq Scan on dim_tbl d (cost=0.00..0.07 rows=2 width=8) Filter: (("k" / 10) > 0)

RLS가 적용되는 전체 쿼리 계획을 살펴볼 수 있도록, Amazon Redshift는 EXPLAIN RLS 시스템 권한을 제공합니다. 이 권한이 부여된 사용자는 RLS 조건자까지 포함한 전체 쿼리 계획을 살펴볼 수 있습니다.

다음 예는 RLS SecureScan 노드 아래의 추가 Seq Scan에 RLS 정책 조건자(k_dim > 1)도 포함되어 있음을 보여줍니다.

EXPLAIN SELECT D.cint FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k WHERE F.k_dim / 10 > 0; QUERY PLAN --------------------------------------------------------------------------------- XN Hash Join DS_DIST_ALL_NONE (cost=0.08..0.25 rows=1 width=4) Hash Cond: ("outer".k_dim = "inner"."k") *-> XN RLS SecureScan f (cost=0.00..0.14 rows=2 width=4) Filter: ((k_dim / 10) > 0)* -> *XN* *Seq Scan on fact_tbl rls_table (cost=0.00..0.06 rows=5 width=8) Filter: (k_dim > 1)* -> XN Hash (cost=0.07..0.07 rows=2 width=8) -> XN Seq Scan on dim_tbl d (cost=0.00..0.07 rows=2 width=8) Filter: (("k" / 10) > 0)

사용자에게 EXPLAIN RLS 권한이 부여되지만, Amazon Redshift는 RLS 조건자를 포함한 전체 쿼리 계획을 STL_EXPLAIN 시스템 테이블에 로깅합니다. 이 권한이 부여되지 않은 상태에서 실행되는 쿼리는 RLS 내부 정보 없이 로깅됩니다. EXPLAIN RLS 권한을 부여하거나 제거해도 Amazon Redshift가 이전 쿼리와 관련하여 STL_EXPLANT에 로깅한 내용은 변경되지 않습니다.

AWS Lake Formation-RLS 보호 Redshift 관계

다음 예는 Lake Formation-RLS 관계를 보는 데 사용할 수 있는 LF SecureScan 노드를 보여줍니다.

EXPLAIN SELECT * FROM lf_db.public.t_share WHERE a > 1; QUERY PLAN --------------------------------------------------------------- XN LF SecureScan t_share (cost=0.00..0.02 rows=2 width=11) (2 rows)

예시

참고

다음 예의 경우 샘플 출력은 Amazon Redshift 구성에 따라 다를 수 있습니다.

다음 예에서는 EVENT 및 VENUE 테이블에서 EVENTID, EVENTNAME, VENUEID 및 VENUENAME을 선택하는 쿼리를 위한 쿼리 계획을 반환합니다.

explain select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
QUERY PLAN -------------------------------------------------------------------------- XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23) -> XN Hash (cost=2.02..2.02 rows=202 width=22) -> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22) (5 rows)

다음 예에서는 상세한 출력을 포함한 동일한 쿼리를 위한 쿼리 계획을 반환합니다.

explain verbose select eventid, eventname, event.venueid, venuename from event, venue where event.venueid = venue.venueid;
QUERY PLAN -------------------------------------------------------------------------- {HASHJOIN :startup_cost 2.52 :total_cost 58653620.93 :plan_rows 8712 :plan_width 43 :best_pathkeys <> :dist_info DS_DIST_OUTER :dist_info.dist_keys ( TARGETENTRY { VAR :varno 2 :varattno 1 ... XN Hash Join DS_DIST_OUTER (cost=2.52..58653620.93 rows=8712 width=43) Hash Cond: ("outer".venueid = "inner".venueid) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=23) -> XN Hash (cost=2.02..2.02 rows=202 width=22) -> XN Seq Scan on venue (cost=0.00..2.02 rows=202 width=22) (519 rows)

다음 예에서는 CREATE TABLE AS(CTAS) 문을 위한 쿼리 계획을 반환합니다.

explain create table venue_nonulls as select * from venue where venueseats is not null; QUERY PLAN ----------------------------------------------------------- XN Seq Scan on venue (cost=0.00..2.02 rows=187 width=45) Filter: (venueseats IS NOT NULL) (2 rows)