Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
쿼리 계획을 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가지 기법을 참조하세요.
관련 정보
- 언어
- 한국어
