ablog

不器用で落着きのない技術者のメモ

細かすぎて伝わらない Amazon Redshift のシステムテーブル/ビュー選手権: SYS_QUERY_DETAIL に plan_node_id 列が追加された

AWS エンジニアの皆様、AWS サービスアップデートのキャッチアップおつかれさまですm(._.)m
このエントリは AWS Analytics Advent Calendar 2024 の4日目の記事です。
3日目は 大薗さんの状況に合わせて、とても素晴らしい食事プランを提案してくれる 有益なエントリでした!

AWS Summit Tokyo 2023 で "Amazon Redshift クエリパフォーマンスチューニング Deep Dive" というタイトルで、Amazon Redshift でシステムテーブル/ビューを使ってシステマチックにクエリのボトルネックを特定・チューニングする手法を発表しましたが、最近のすばらしいアップデートを共有します。

SYS_QUERY_DETAIL に plan_node_id 列が追加され、これまで クエリのボトルネック分析でどのセグメント・ステップで時間を要しているか特定した後、実行計画のどのオペレーションと対応するかはオペレーション名で紐づける必要がありましたが、SYS_QUERY_DETAIL に plan_node_id 列が追加され機械的に実行計画 SYS_QUERY_EXPLAIN の plan_node_id 列と結合してマッピングできるようになりました!

plan_node_id がなかったとき

実行計画のオペレーション名で紐付けしないといけなかったのですが、


plan_node_id があるとき

SYS_QUERY_DETAIL と SYS_QUERY_EXPLAIN を plan_node_id で機械的に結合できます。

tpch_100gb awsuser 20241204_15:27:57 =# select a.query_id, a.stream_id, a.segment_id, a.step_id, a.step_name, a.duration, a.input_bytes, a.output_bytes, a.input_rows, a.output_rows, b.plan_parent_id, substring(b.plan_node,1,100) plan_node
from sys_query_detail a, sys_query_explain b
where  a.query_id = 3178
and a.query_id = b.query_id
and b.plan_node_id = a.plan_node_id
order by a.query_id, a.stream_id, a.segment_id, a.step_id;
 query_id | stream_id | segment_id | step_id | step_name  | duration | input_bytes | output_bytes | input_rows | output_rows | plan_parent_id |                                           plan_node
----------+-----------+------------+---------+------------+----------+-------------+--------------+------------+-------------+----------------+-----------------------------------------------------------------------------------------------
     3178 |         0 |          0 |       0 | scan       |  1612796 |           0 |    269433360 |   10745485 |     7484260 |              5 |                     ->  XN Seq Scan on lineitem  (cost=0.00..120535.76 rows=8035718 width=40)
     3178 |         0 |          0 |       2 | distribute |  1612796 |           0 |    179622240 |          0 |     7484260 |              2 |         ->  XN Hash Join DS_DIST_INNER  (cost=172290.28..9643380731.17 rows=8035718 width=56)
     3178 |         0 |          1 |       0 | scan       |  1627169 |           0 |    179622240 |          0 |     7484260 |              2 |         ->  XN Hash Join DS_DIST_INNER  (cost=172290.28..9643380731.17 rows=8035718 width=56)
     3178 |         0 |          1 |       2 | hash       |  1627169 |           0 |    239496320 |          0 |     7484260 |              3 |               ->  XN Hash  (cost=120535.76..120535.76 rows=8035718 width=40)
     3178 |         1 |          2 |       0 | scan       |   939133 |           0 |    753563993 |   20000000 |    18560685 |              3 |               ->  XN Seq Scan on part  (cost=0.00..200000.00 rows=20000000 width=32)
     3178 |         1 |          2 |       3 | hashjoin   |   939133 |           0 |            0 |          0 |     7484260 |              2 |         ->  XN Hash Join DS_DIST_INNER  (cost=172290.28..9643380731.17 rows=8035718 width=56)
     3178 |         1 |          2 |       6 | aggregate  |   939133 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          3 |       0 | scan       |     2445 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          3 |       1 | return     |     2445 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          4 |       0 | scan       |     1577 |           0 |          768 |          0 |          16 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         2 |          4 |       1 | aggregate  |     1577 |           0 |           48 |          0 |           1 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
     3178 |         3 |          5 |       0 | scan       |      191 |           0 |           48 |          0 |           1 |              1 |   ->  XN Aggregate  (cost=9643420909.76..9643420909.78 rows=1 width=56)
(12 rows)

Time: 9170.031 ms (00:09.170)

5日目は @tdmnishi さんの Amazon DataZone 経由で SageMaker Canvas へデータインポート #AWS - Qiita です、いってらっしゃい!

参考

アドベントカレンダー」(Advent Calendar)とは、クリスマスまでの期間(待降節アドベント)をより楽しく過ごすため、12月1日から24日までの間カウントダウンしていく“日めくりカレンダー”のことです。
(中略)
IT業界では、このアドベントカレンダーの風習に習って、12月1〜24日の間、何かのテーマや、何らかの制限事項(縛り)を設けてWebにコラム記事を書くというイベントを楽しむようになりました(なかには25日や年末まで続けるものもあるようです)。

師走を楽しもう。技術系アドベントカレンダーの魅力とは:安藤幸央ランダウン(59) - @IT

師走を楽しもう。技術系アドベントカレンダーの魅力とは:安藤幸央のランダウン(59) - @IT