Como faço para correlacionar o plano de consulta com o relatório de consultas no Amazon Redshift?

8 minuto de leitura
0

Quero correlacionar o plano de consulta com o relatório de consulta no meu cluster do Amazon Redshift.

Breve descrição

Para determinar o uso necessário para executar uma consulta no Amazon Redshift, execute o comando EXPLAIN. O plano de execução retornado pelo comando EXPLAIN descreve as etapas de planejamento e execução da consulta envolvidas. Em seguida, use a visualização do sistema SVL_QUERY_REPORT para visualizar as informações da consulta em um nível de fatia do cluster. Você pode usar as informações em nível de fatia para detectar uma distribuição desigual de dados no cluster, o que pode afetar o desempenho da consulta.

O Amazon Redshift processa o plano de consulta e traduz o plano em etapas, segmentos e fluxos. Para obter mais informações, consulte Fluxo de trabalho de planejamento e execução de consultas.

Resolução

Crie uma tabela e obtenha o plano de execução e o relatório de consulta SVL da consulta

Para criar uma tabela e obter o plano de execução e o relatório de consulta SVL, realize as etapas a seguir:

  1. Crie duas tabelas com diferentes chaves de classificação e chaves de distribuição.

  2. Execute a consulta a seguir quando uma operação de junção não foi executada em uma chave de distribuição:

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

    Essa consulta distribui a tabela interna para todos os nós de computação.

  3. Recupere o plano de consulta:

    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. Execute a consulta SVL_QUERY_REPORT para obter o relatório da consulta:

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

    Observação: substitua query_id pelo ID da sua consulta.

Mapeie o plano de consulta com o relatório de consulta

Para mapear o plano de consulta com o relatório de consulta, realize as etapas a seguir:

  1. Execute a consulta a seguir para obter o svl_query_report para uma consulta com um valor de segmento de 0:
    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)
    Veja a seguir um exemplo de saída:
    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)
    Na saída anterior, quando o valor do segmento é 0, o Amazon Redshift executa uma operação de varredura sequencial para escanear a tabela de eventos. Você pode encontrar a operação de varredura sequencial na coluna rótulo.
  2. Execute a consulta a seguir para obter o svl_query_report para uma consulta com um valor de segmento de 1:
    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;
    Veja a seguir um exemplo de saída:
    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)
    A consulta continua sendo executada até que o valor do segmento seja 1. Uma operação de tabela de hash é executada na tabela interna da junção.
  3. Execute a consulta a seguir para obter o svl_query_report para uma consulta com um valor de segmento de 2:
    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)
    Veja a seguir um exemplo de saída:
    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)
    No exemplo anterior, a consulta é executada quando o valor do segmento é 2 e executa uma operação de varredura sequencial para verificar a tabela vendas. No mesmo segmento, uma operação agregada é executada para agregar resultados e, em seguida, uma operação de junção de hash é executada para unir tabelas. A junção de colunas de uma das tabelas não é uma chave de distribuição nem uma chave de classificação. Como resultado, a tabela interna é distribuída para todos os nós de computação como DS_BCAST_INNER. Em seguida, é possível ver a tabela interna no plano de execução. Você também pode executar essa consulta para obter o SVL_QUERY_REPORT para uma consulta com um valor de segmento de 3, 4 e 5.

Nesses segmentos, uma operação de agregação de hash e uma operação de classificação são executadas e identificadas a partir dos rótulos “aggr” e “sort”. A operação de agregação de hash é executada em funções agregadas agrupadas não classificadas. A operação de classificação é executada para avaliar a cláusula ORDER BY.

Depois que todos os segmentos forem usados, a consulta executa uma operação de rede nos segmentos 4 e 5 para enviar resultados intermediários ao nó líder. Os resultados são enviados ao nó líder para processamento adicional. É possível ver os resultados com a etiqueta “devolução”.

Depois que a consulta for concluída, execute a consulta a seguir para verificar o tempo de execução da consulta em milissegundos:

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

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

Otimize sua consulta

Ao analisar seu plano de consulta, você pode ajustar o desempenho da consulta com base no seu caso de uso. Para obter mais informações, consulte As dez principais técnicas de ajuste de performance para o Amazon Redshift.

Informações relacionadas

Como mapear o plano de consulta com o resumo da consulta

Como revisar as etapas do plano de consulta

Como usar a visualização SVL_QUERY_REPORT

AWS OFICIAL
AWS OFICIALAtualizada há 2 meses