RedshiftのSQL実行時間の取得方法メモ。
※Redshiftは日本時間で土曜日22:00に定期メンテナンスがあり、都度都度仕様変更が入ります。執筆時点の情報である旨ご承知おきください。
A. システムテーブルからログを取得する
1. queryidの特定
実行時間を見たいSQLのqueryidを特定する。※1
特定方法:
- SQLを流した同じトランザクション内で、
SELECT pg_last_query_id();
を実行 - SQL全量を記録しているシステムテーブルから検索する(STL_QUERYTEXTなど)
- AWSコンソールのクラスタから
※1 queryidは、wlmに計画されないと発行されない。ResultCacheにひっかかったらだめ、DDLはそもそも発行なし。
2. SQLを流してほしい実行ステップのログを確認する
下記SQL。
※それぞれのログが独立したステップではなく、ところどころ計測区間が重複する。
-- SQL全体のステップごとの転送バイト数などを取得 -- スライスごとの負荷は見れず、そちらを確認するには後続のクエリから確認する SELECT 'SVL_QUERY_SUMMARY', * FROM SVL_QUERY_SUMMARYWHERE query=3420575 ORDER BY query,stm,segment,step; -- SELECT文全体 SELECT 'STL_QUERY', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_QUERY WHERE query=3420575 ORDER BY query; -- DELETE step全体 SELECT 'STL_DELETE', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_DELETE WHERE query=3420575 ORDER BY query,segment,step,slice; -- INSERT step全体 SELECT 'STL_INSERT', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_INSERT WHERE query=3420575 ORDER BY query,segment,step,slice; -- 再分散(bloadcast)ステップ SELECT 'STL_BCAST', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_BCAST WHERE query=3420575 ORDER BY query,segment,step,slice; -- 再分散(dist)ステップ SELECT 'STL_DIST', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_DIST WHERE query=3420575 ORDER BY query,segment,step,slice; -- FULL OUTER JOINステップ SELECT 'STL_NESTLOOP', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_NESTLOOP WHERE query=3420575 ORDER BY query,segment,step,slice; -- ハッシュJOINステップ SELECT 'STL_HASHJOIN', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_HASHJOIN WHERE query=3420575 ORDER BY query,segment,step,slice; -- マージJOINステップ SELECT 'STL_MERGEJOIN', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_MERGEJOIN WHERE query=3420575 ORDER BY query,segment,step,slice; -- ハッシュ化?(詳細不明)ステップ SELECT 'STL_HASH', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_HASH WHERE query=3420575 ORDER BY query,segment,step,slice; -- マージステップ SELECT 'STL_MERGE', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_MERGE WHERE query=3420575 ORDER BY query,segment,step,slice; -- Group by集計ステップ SELECT 'STL_AGGR', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_AGGR WHERE query=3420575 ORDER BY query,segment,step,slice; -- LIMIT句ステップ SELECT 'STL_LIMIT', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_LIMIT WHERE query=3420575 ORDER BY query,segment,step,slice; -- 列射影・選択ステップ SELECT 'STL_PROJECT', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_PROJECT WHERE query=3420575 ORDER BY query,segment,step,slice; -- リターンステップ(呼び出し元へのデータ返送) SELECT 'STL_RETURN', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_RETURN WHERE query=3420575 ORDER BY query,segment,step,slice; -- 一時データ保存ステップ SELECT 'STL_SAVE', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_SAVE WHERE query=3420575 ORDER BY query,segment,step,slice; -- データSCANステップ SELECT 'STL_SCAN', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_SCAN WHERE query=3420575 ORDER BY query,segment,step,slice; -- ソートステップ SELECT 'STL_SORT', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_SORT WHERE query=3420575 ORDER BY query,segment,step,slice; -- Distinctステップ SELECT 'STL_UNIQUE', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_UNIQUE WHERE query=3420575 ORDER BY query,segment,step,slice; -- Windows関数計算ステップ SELECT 'STL_WINDOW', *, DATEDIFF(microsecond, starttime, endtime) as micro_secs FROM STL_WINDOW WHERE query=3420575 ORDER BY query,segment,step,slice;
B. AWSコンソールから可視化された実行計画を見る
1. queryidの特定
A.パート参照参照
2. AWSコンソールから閲覧
AWSコンソールから Redshift>クラスター>見たいクラスター>クエリ>各クエリをクリック> クエリの実行の詳細:Actual
でいい感じに可視化