Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
쿼리 계획을 Amazon Redshift의 쿼리 보고서와 연관시키려면 어떻게 해야 하나요?
쿼리 계획을 Amazon Redshift 클러스터의 쿼리 보고서와 연관시키려고 합니다.
간략한 설명
Amazon Redshift에서 쿼리를 실행할 때 필요한 사용량을 확인하려면 EXPLAIN 명령을 사용하세요. EXPLAIN 명령으로 반환되는 실행 계획에는 관련 쿼리 계획 및 실행 단계가 요약되어 있습니다. 그 후, SVL_QUERY_REPORT 시스템 보기를 사용해 클러스터 슬라이스 수준에서 쿼리 정보를 확인합니다. 슬라이스 수준 정보를 사용해 클러스터 전체에서 데이터 분포가 고르지 않아 쿼리 성능에 영향을 미칠 수 있는 부분을 탐지할 수 있습니다.
Amazon Redshift는 쿼리 계획을 처리하고 계획을 단계, 세그먼트, 스트림으로 변환합니다. 자세한 내용은, 쿼리 계획 및 실행 워크플로를 참고하세요.
해결 방법
테이블을 생성하고 쿼리 실행 계획 및 SVL 쿼리 보고서를 가져옵니다.
테이블을 생성하고 실행 계획 및 SVL 쿼리 보고서를 가져오려면, 다음 단계를 따르세요.
-
배포 키에서 조인 작업이 실행되지 않은 경우 다음 쿼리를 실행합니다.
select eventname, sum (pricepaid) from sales, event where sales.eventid = event.eventid group by eventname order by 2 desc;
이는 내부 테이블을 모든 컴퓨팅 노드에 배포하는 쿼리입니다.
-
쿼리 계획 가져오기:
EXPLAIN <query>; QUERY PLAN -------------------------------------------------------------------------------------------------------- XN Merge (cost=1002815368414.24..1002815368415.67 rows=571 width=27) Merge Key: sum(sales.pricepaid) -> XN Network (cost=1002815368414.24..1002815368415.67 rows=571 width=27) Send to leader -> XN Sort (cost=1002815368414.24..1002815368415.67 rows=571 width=27) Sort Key: sum(sales.pricepaid) -> XN HashAggregate (cost=2815368386.67..2815368388.10 rows=571 width=27) -> XN Hash Join DS_BCAST_INNER (cost=109.98..2815367496.05 rows=178125 width=27) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=14) -> XN Hash (cost=87.98..87.98 rows=8798 width=21) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=21) (12 rows)
-
SVL_QUERY_REPORT 쿼리를 실행해 쿼리 보고서를 가져옵니다.
select * from svl_query_report where query = query_id order by segment, step, elapsed_time, rows;
참고: query_id를 내 쿼리 ID로 변경합니다.
쿼리 보고서로 쿼리 계획 매핑
쿼리 보고서로 쿼리 계획을 매핑하려면, 다음 단계를 따르세요.
- 세그먼트 값이 0인 쿼리를 위해, 다음 쿼리를 실행해 svl_query_report를 가져옵니다.
다음은 예제 출력입니다.select query,slice,segment,step,start_time,end_time,elapsed_time,rows,bytes,label from svl_query_report where query = 938787 and segment = 0 order by segment, step, elapsed_time, rows; EXPLAIN <query>; -> XN Hash (cost=87.98..87.98 rows=8798 width=21) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=21)
위 출력에서 세그먼트 값이 0일 때 Amazon Redshift에서는 순차 스캔 작업을 실행해 이벤트 테이블을 스캔합니다. 레이블 열에서 순차 스캔 작업을 찾을 수 있습니다.query | slice | segment | step | start_time | end_time | elapsed_time | rows | bytes | label -------+-------+---------+------+----------------------------+---------------------------+--------------+------+--------+------------------------------ 938787 | 0 | 0 | 0 | 2020-05-22 11:11:48.828309 | 2020-05-22 11:11:48.82987 | 1561 | 4383 | 128626 | scan tbl=278788 name=event 938787 | 1 | 0 | 0 | 2020-05-22 11:11:48.828309 | 2020-05-22 11:11:48.82987 | 1561 | 4415 | 128918 | scan tbl=278788 name=event 938787 | 0 | 0 | 1 | 2020-05-22 11:11:48.828309 | 2020-05-22 11:11:48.82987 | 1561 | 4383 | 0 | project 938787 | 1 | 0 | 1 | 2020-05-22 11:11:48.828309 | 2020-05-22 11:11:48.82987 | 1561 | 4415 | 0 | project 938787 | 0 | 0 | 2 | 2020-05-22 11:11:48.828309 | 2020-05-22 11:11:48.82987 | 1561 | 4383 | 126660 | bcast ... (6 rows)
- 세그먼트 값이 1인 쿼리를 위해 다음 쿼리를 실행해 svl_query_report를 가져옵니다.
다음은 예제 출력입니다.select query,slice,segment,step,start_time,end_time,elapsed_time,rows,bytes,label from svl_query_report where query = 938787 and segment = 1 order by segment, step, elapsed_time, rows;
세그먼트 값이 1이 될 때까지 쿼리가 계속 실행됩니다. 조인 내부 테이블에서 해시 테이블 작업이 실행됩니다.query | slice | segment | step | start_time | end_time | elapsed_time | rows | bytes | label -------+-------+---------+------+---------------------------+----------------------------+--------------+------+--------+------------------------------------------- 938787 | 1 | 1 | 0 | 2020-05-22 11:11:48.826864 | 2020-05-22 11:11:48.830037 | 3173 | 0 | 0 | scan tbl=376297 name=Internal Worktable 938787 | 0 | 1 | 0 | 2020-05-22 11:11:48.826864 | 2020-05-22 11:11:48.831142 | 4278 | 8798 | 253580 | scan tbl=376297 name=Internal Worktable 938787 | 1 | 1 | 1 | 2020-05-22 11:11:48.826864 | 2020-05-22 11:11:48.830037 | 3173 | 0 | 0 | project 938787 | 0 | 1 | 1 | 2020-05-22 11:11:48.826864 | 2020-05-22 11:11:48.831142 | 4278 | 8798 | 0 | project 938787 | 1 | 1 | 2 | 2020-05-22 11:11:48.826864 | 2020-05-22 11:11:48.830037 | 3173 | 0 | 0 | hash tbl=439 ... (6 rows)
- 세그먼트 값이 2인 쿼리를 위해, 다음 쿼리를 실행해 svl_query_report를 가져옵니다.
다음은 예제 출력입니다.select query,slice,segment,step,start_time,end_time,elapsed_time,rows,bytes,label from svl_query_report where query = 938787 and segment = 2 order by segment, step, elapsed_time, rows; EXPLAIN <query>; -> XN Hash Join DS_BCAST_INNER (cost=109.98..2815367496.05 rows=178125 width=27) Hash Cond: ("outer".eventid = "inner".eventid) -> XN Seq Scan on sales (cost=0.00..1724.56 rows=172456 width=14)
위 출력에서는 세그먼트 값이 2일 때, 순차 스캔 작업을 실행해 판매 테이블을 스캔합니다. 동일한 세그먼트에서 집계 작업을 실행해 결과를 집계하고 해시 조인 작업을 실행해 테이블을 조인합니다. 테이블 중 하나의 조인 열은 배포 키나 정렬 키가 아닙니다. 따라서 내부 테이블이 컴퓨팅 노드 전체에 DS\ _BCAST\ _INNER로 배포됩니다. 그러면 실행 계획에서 내부 테이블을 볼 수 있습니다. 또 이 쿼리를 실행하여 세그먼트 값이 3, 4, 5인 쿼리의 SVL_QUERY_REPORT를 가져올 수 있습니다.query | slice | segment | step | start_time | end_time | elapsed_time | rows | bytes | label --------+-------+---------+------+----------------------------+----------------------------+--------------+-------+---------+------------------------------ 938787 | 1 | 2 | 0 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 86519 | 1730380 | scan tbl=278792 name=sales 938787 | 0 | 2 | 0 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 85937 | 1718740 | scan tbl=278792 name=sales 938787 | 1 | 2 | 1 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 86519 | 0 | project 938787 | 0 | 2 | 1 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 85937 | 0 | project 938787 | 1 | 2 | 2 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 86519 | 0 | project 938787 | 0 | 2 | 2 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 85937 | 0 | project 938787 | 1 | 2 | 3 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 86519 | 0 | hjoin tbl=439 938787 | 0 | 2 | 3 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 85937 | 0 | hjoin tbl=439 938787 | 1 | 2 | 4 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 86519 | 0 | project 938787 | 0 | 2 | 4 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 85937 | 0 | project 938787 | 1 | 2 | 5 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 86519 | 0 | project 938787 | 0 | 2 | 5 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 85937 | 0 | project 938787 | 1 | 2 | 6 | 2020-05-22 11:11:48.839297 | 2020-05-22 11:11:48.865857 | 26560 | 576 | 34916 | aggr tbl=448 938787 | 0 | 2 | 6 | 2020-05-22 11:11:48.838371 | 2020-05-22 11:11:48.865857 | 27486 | 576 | 34916 | aggr tbl=448 ... (16 rows)
이 세그먼트에서는 해시 집계 작업과 정렬 작업이 실행되고 “aggr” 및 “sort”라는 레이블에서 식별됩니다. 해시 집계 작업은 정렬되지 않고 그룹화된 집계 함수에서 실행됩니다. 정렬 작업은 ORDER BY 절을 평가하기 위해 실행됩니다.
세그먼트가 전체가 사용된 후 쿼리가 세그먼트 4와 5에서 네트워크 작업을 실행하여 중간 결과를 리더 노드로 보냅니다. 결과는 리더 노드로 전송되어 추가 처리됩니다. “반환” 레이블에서 이 결과를 확인할 수 있습니다.
쿼리가 완료된 후에는 다음 쿼리를 실행해 쿼리의 실행 시간을 밀리초 단위로 확인합니다.
select datediff (ms, exec_start_time, exec_end_time) from stl_wlm_query where query= 938787; date_diff ----------- 101 (1 row)
쿼리 최적화
쿼리 계획을 분석할 때 사용 사례에 따라 쿼리 성능을 조정할 수 있습니다. 자세한 내용은, Amazon Redshift 성능 튜닝을 위한 10가지 기법을 참조하세요.
관련 정보

관련 콘텐츠
- 질문됨 한 달 전lg...
- 질문됨 2년 전lg...
- 질문됨 한 달 전lg...
- 질문됨 한 달 전lg...
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 일 년 전