쿼리 계획을 Amazon Redshift의 쿼리 보고서와 연관시키려면 어떻게 해야 하나요?

7분 분량
0

쿼리 계획을 Amazon Redshift 클러스터의 쿼리 보고서와 연관시키려고 합니다.

간략한 설명

Amazon Redshift에서 쿼리를 실행할 때 필요한 사용량을 확인하려면 EXPLAIN 명령을 사용하세요. EXPLAIN 명령으로 반환되는 실행 계획에는 관련 쿼리 계획 및 실행 단계가 요약되어 있습니다. 그 후, SVL_QUERY_REPORT 시스템 보기를 사용해 클러스터 슬라이스 수준에서 쿼리 정보를 확인합니다. 슬라이스 수준 정보를 사용해 클러스터 전체에서 데이터 분포가 고르지 않아 쿼리 성능에 영향을 미칠 수 있는 부분을 탐지할 수 있습니다.

Amazon Redshift는 쿼리 계획을 처리하고 계획을 단계, 세그먼트, 스트림으로 변환합니다. 자세한 내용은, 쿼리 계획 및 실행 워크플로를 참고하세요.

해결 방법

테이블을 생성하고 쿼리 실행 계획 및 SVL 쿼리 보고서를 가져옵니다.

테이블을 생성하고 실행 계획 및 SVL 쿼리 보고서를 가져오려면, 다음 단계를 따르세요.

  1. 정렬 키와 배포 키가 다른 테이블 두 개를 생성합니다.

  2. 배포 키에서 조인 작업이 실행되지 않은 경우 다음 쿼리를 실행합니다.

    select eventname, sum (pricepaid) from sales, event where sales.eventid = event.eventid group by eventname order by 2 desc;

    이는 내부 테이블을 모든 컴퓨팅 노드에 배포하는 쿼리입니다.

  3. 쿼리 계획 가져오기:

    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)
  4. SVL_QUERY_REPORT 쿼리를 실행해 쿼리 보고서를 가져옵니다.

    select * from svl_query_report where query = query_id order by segment, step, elapsed_time, rows;

    참고: query_id를 내 쿼리 ID로 변경합니다.

쿼리 보고서로 쿼리 계획 매핑

쿼리 보고서로 쿼리 계획을 매핑하려면, 다음 단계를 따르세요.

  1. 세그먼트 값이 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)
    다음은 예제 출력입니다.
    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)
    위 출력에서 세그먼트 값이 0일 때 Amazon Redshift에서는 순차 스캔 작업을 실행해 이벤트 테이블을 스캔합니다. 레이블 열에서 순차 스캔 작업을 찾을 수 있습니다.
  2. 세그먼트 값이 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;
    다음은 예제 출력입니다.
    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)
    세그먼트 값이 1이 될 때까지 쿼리가 계속 실행됩니다. 조인 내부 테이블에서 해시 테이블 작업이 실행됩니다.
  3. 세그먼트 값이 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)
    다음은 예제 출력입니다.
    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)
    위 출력에서는 세그먼트 값이 2일 때, 순차 스캔 작업을 실행해 판매 테이블을 스캔합니다. 동일한 세그먼트에서 집계 작업을 실행해 결과를 집계하고 해시 조인 작업을 실행해 테이블을 조인합니다. 테이블 중 하나의 조인 열은 배포 키나 정렬 키가 아닙니다. 따라서 내부 테이블이 컴퓨팅 노드 전체에 DS\ _BCAST\ _INNER로 배포됩니다. 그러면 실행 계획에서 내부 테이블을 볼 수 있습니다. 또 이 쿼리를 실행하여 세그먼트 값이 3, 4, 5인 쿼리의 SVL_QUERY_REPORT를 가져올 수 있습니다.

이 세그먼트에서는 해시 집계 작업과 정렬 작업이 실행되고 “aggr” 및 “sort”라는 레이블에서 식별됩니다. 해시 집계 작업은 정렬되지 않고 그룹화된 집계 함수에서 실행됩니다. 정렬 작업은 ORDER BY 절을 평가하기 위해 실행됩니다.

세그먼트가 전체가 사용된 후 쿼리가 세그먼트 45에서 네트워크 작업을 실행하여 중간 결과를 리더 노드로 보냅니다. 결과는 리더 노드로 전송되어 추가 처리됩니다. “반환” 레이블에서 이 결과를 확인할 수 있습니다.

쿼리가 완료된 후에는 다음 쿼리를 실행해 쿼리의 실행 시간을 밀리초 단위로 확인합니다.

select datediff (ms, exec_start_time, exec_end_time) from stl_wlm_query where query= 938787;

date_diff
-----------
101
(1 row)

쿼리 최적화

쿼리 계획을 분석할 때 사용 사례에 따라 쿼리 성능을 조정할 수 있습니다. 자세한 내용은, Amazon Redshift 성능 튜닝을 위한 10가지 기법을 참조하세요.

관련 정보

쿼리 계획을 쿼리 요약에 매핑

쿼리 계획 단계 검토

SVL_QUERY_REPORT 보기 사용

AWS 공식
AWS 공식업데이트됨 한 달 전