Como faço para correlacionar o plano de consulta com o relatório de consultas no Amazon Redshift?
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:
-
Crie duas tabelas com diferentes chaves de classificação e chaves de distribuição.
-
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.
-
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)
-
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:
- Execute a consulta a seguir para obter o svl_query_report para uma consulta com um valor de segmento de 0:
Veja a seguir um exemplo de saída: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)
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.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)
- Execute a consulta a seguir para obter o svl_query_report para uma consulta com um valor de segmento de 1:
Veja a seguir um exemplo de saída: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;
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.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)
- Execute a consulta a seguir para obter o svl_query_report para uma consulta com um valor de segmento de 2:
Veja a seguir um exemplo de saída: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)
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.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)
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
Conteúdo relevante
- Resposta aceitafeita há 5 diaslg...
- feita há 7 diaslg...
- feita há 21 diaslg...
- feita há 7 diaslg...
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um ano