¿Cómo puedo correlacionar el plan de consulta con el informe de consultas en Amazon Redshift?

8 minutos de lectura
0

Quiero correlacionar el plan de consulta con el informe de consultas de mi clúster de Amazon Redshift.

Breve descripción

Para determinar el uso que se requiere para ejecutar una consulta en Amazon Redshift, ejecute el comando EXPLAIN. El plan de ejecución devuelto por el comando EXPLAIN informa de los pasos implicados de planificación y ejecución de consultas. A continuación, utilice la vista de sistema SVL_QUERY_REPORT para ver información sobre la consulta en el nivel de segmento del clúster. Puede usar la información del nivel de segmento para detectar una distribución desigual de los datos en el clúster que pueda afectar al rendimiento de las consultas.

Amazon Redshift procesa el plan de consulta y lo convierte en pasos, segmentos y secuencias. Para obtener más información, consulte Flujo de trabajo de planificación y ejecución de consultas.

Solución

Creación de una tabla y obtención del plan de ejecución y el informe de SVL de la consulta

Para crear una tabla y obtener el plan de ejecución y el informe de SVL de la consulta, siga estos pasos:

  1. Cree dos tablas con diferentes claves de ordenación y distribución.

  2. Ejecute la siguiente consulta si no se ha realizado ninguna operación de unión en una clave de distribución:

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

    Esta consulta distribuye la tabla interna a todos los nodos de computación.

  3. Recupere el plan 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. Ejecute la consulta SVL_QUERY_REPORT para obtener el informe de la consulta:

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

    Nota: Sustituya query_id por el ID de la consulta.

Asignación del plan de consulta con el informe de consultas

Para asignar el plan de consulta con el informe de consultas, siga estos pasos:

  1. Ejecute la siguiente consulta para obtener el svl_query_report de una consulta con un 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)
    A continuación se muestra un resultado de ejemplo:
    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)
    En el resultado anterior, cuando el valor del segmento es 0, Amazon Redshift realiza una operación de escaneo secuencial para escanear la tabla de eventos. Puede encontrar la operación de escaneo secuencial en la columna label.
  2. Ejecute la siguiente consulta para obtener el informe svl_query_report de una consulta con un 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;
    A continuación se muestra un resultado de ejemplo:
    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 consulta continuará ejecutándose hasta que el valor del segmento sea 1. Se realiza una operación de tabla hash en la tabla interna de la unión.
  3. Ejecute la siguiente consulta para obtener el informe svl_query_report de una consulta con un 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)
    A continuación se muestra un resultado de ejemplo:
    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)
    En el ejemplo anterior, la consulta se ejecuta cuando el valor del segmento es 2 y realiza una operación de escaneo secuencial para escanear la tabla sales. En el mismo segmento, se realiza una operación de agregación para agregar los resultados y, a continuación, se realiza una operación de unión de hash para unir tablas. Las columnas de unión en una de las tablas no son una clave de distribución ni de ordenación. Como resultado, la tabla interna se distribuye a todos los nodos de computación como DS_BCAST_INNER. A continuación, puede ver la tabla interna en el plan de ejecución. También puede ejecutar esta consulta para obtener el informe SVL_QUERY_REPORT de una consulta con un valor de segmento de 3, 4 y 5.

En estos segmentos, se realiza una operación de ordenación y otra de agregación de hash, identificadas por las etiquetas «aggr» y «sort». La operación de agregación de hash se realiza en funciones de agregación agrupadas sin ordenar. La operación de ordenación se realiza para evaluar la cláusula ORDER BY.

Una vez utilizados todos los segmentos, la consulta ejecuta una operación de red en los segmentos 4 y 5 para enviar los resultados provisionales al nodo principal. Los resultados se envían al nodo principal para continuar con el procesamiento. Puede ver los resultados con la etiqueta «return».

Una vez completada la consulta, ejecute la siguiente consulta para comprobar el tiempo de ejecución de la consulta en milisegundos:

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

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

Optimización de una consulta

Cuando analice su plan de consulta, podrá ajustar el rendimiento de las consultas en función de su caso de uso. Para obtener más información, consulte Top 10 performance tuning techniques for Amazon Redshift.

Información relacionada

Mapeo entre el plan de consulta y el resumen de la consulta

Revisión de los pasos del plan de consulta

Uso de la vista SVL_QUERY_REPORT

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 meses