Come posso abbinare il piano di query con il report di query in Amazon Redshift?
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:
-
Crea due tabelle con chiavi di ordinamento e chiavi di distribuzione diverse.
-
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.
-
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)
-
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:
- Esegui la query seguente per ottenere svl_query_report per una query con un valore di segmento pari a 0:
Di seguito è riportato un esempio di output: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)
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.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)
- Esegui la query seguente per ottenere svl_query_report per una query con un valore di segmento pari a 1:
Di seguito è riportato un esempio di output: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;
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.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)
- Esegui la query seguente per ottenere svl_query_report per una query con un valore di segmento pari a 2:
Di seguito è riportato un esempio di output: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)
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.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)
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
Contenuto pertinente
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata 2 anni fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata un mese fa