Come posso abbinare il piano di query con il report di query in Amazon Redshift?

8 minuti di lettura
0

Desidero abbinare il piano di query con il report di query nel cluster Amazon Redshift.

Breve descrizione

Per determinare l'utilizzo richiesto per eseguire una query in Amazon Redshift, esegui il comando EXPLAIN. Il piano di esecuzione restituito dal comando EXPLAIN delinea le fasi di pianificazione ed esecuzione delle query coinvolte. Quindi, utilizza la vista di sistema SVL_QUERY_REPORT per visualizzare le informazioni sulle query a livello di sezione del cluster. È possibile utilizzare le informazioni a livello di sezione per rilevare una distribuzione non uniforme dei dati nel cluster che può influire sulle prestazioni delle query.

Amazon Redshift elabora il piano di query e lo traduce in fasi, segmenti e flussi. Per ulteriori informazioni, consulta la pagina Pianificazione di query e flusso di lavoro di esecuzione.

Risoluzione

Crea una tabella e ottieni il piano di esecuzione e il report di query SVL per la query

Per creare una tabella e ottenere il piano di esecuzione e il report di query SVL, completa i seguenti passaggi:

  1. Crea due tabelle con chiavi di ordinamento e chiavi di distribuzione diverse.

  2. Esegui la query seguente se non è stata eseguita un'operazione di unione su una chiave di distribuzione:

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

    Questa query distribuisce la tabella interna a tutti i nodi di calcolo.

  3. Recupera il piano di query:

    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. Esegui la query SVL_QUERY_REPORT per ottenere il report di query:

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

    Nota: sostituisci query_id con l'ID della query.

Mappa il piano di query con il report di query

Per mappare il piano di query con il report di query, completa i passaggi seguenti:

  1. Esegui la query seguente per ottenere svl_query_report per una query con un valore di segmento pari a 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)
    Di seguito è riportato un esempio di output:
    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)
    Nell'output precedente, quando il valore del segmento è 0, Amazon Redshift esegue un'operazione di scansione sequenziale per ottenere la scansione della tabella degli eventi. L'operazione di scansione sequenziale è disponibile nella colonna dell'etichetta.
  2. Esegui la query seguente per ottenere svl_query_report per una query con un valore di segmento pari a 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;
    Di seguito è riportato un esempio di output:
    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)
    La query continua a essere eseguita finché il valore del segmento non è pari a 1. Un'operazione tabella hash viene eseguita sulla tabella interna nell'unione.
  3. Esegui la query seguente per ottenere svl_query_report per una query con un valore di segmento pari a 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)
    Di seguito è riportato un esempio di output:
    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)
    Nell'esempio precedente, la query viene eseguita quando il valore del segmento è pari a 2 ed esegue un'operazione di scansione sequenziale per ottenere la scansione della tabella delle vendite. Nello stesso segmento viene eseguita un'operazione di aggregazione per aggregare i risultati, quindi viene eseguita un'operazione di unione hash per unire le tabelle. Le colonne di unione di una delle tabelle non sono una chiave di distribuzione o una chiave di ordinamento. Di conseguenza, la tabella interna viene distribuita a tutti i nodi di calcolo come DS_BCAST_INNER. È quindi possibile visualizzare la tabella interna nel piano di esecuzione. È inoltre possibile eseguire questa query per ottenere SVL_QUERY_REPORT per una query con un valore di segmento pari a 3, 4 e 5.

In questi segmenti vengono eseguite un'operazione di aggregazione hash e un'operazione di ordinamento, identificate dalle etichette "aggr" e "sort". L'operazione di aggregazione hash viene eseguita su funzioni aggregate raggruppate non ordinate. L'operazione di ordinamento viene eseguita per valutare la clausola ORDER BY.

Dopo aver utilizzato tutti i segmenti, la query esegue un'operazione di rete sui segmenti 4 e 5 per inviare risultati intermedi al nodo leader. I risultati vengono inviati al nodo leader per un'ulteriore elaborazione. I risultati sono visualizzati con l'etichetta "return".

Una volta completata la query, esegui la query seguente per verificare il tempo di esecuzione della query in millisecondi:

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

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

Ottimizza la query

Quando analizzi il piano di query, puoi ottimizzarne le prestazioni in base al caso d'uso specifico. Per ulteriori informazioni, consulta la pagina Top 10 performance tuning techniques for Amazon Redshift.

Informazioni correlate

Mappatura del piano di query sul riepilogo della query

Revisione delle fasi del piano di query

Utilizzo della vista SVL_QUERY_REPORT

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 mesi fa