【Redshift】SQLの実行時間明細を取得・可視化する

RedshiftのSQL実行時間の取得方法メモ。

※Redshiftは日本時間で土曜日22:00に定期メンテナンスがあり、都度都度仕様変更が入ります。執筆時点の情報である旨ご承知おきください。

A. システムテーブルからログを取得する

1. queryidの特定

実行時間を見たいSQLのqueryidを特定する。※1

特定方法:

※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

でいい感じに可視化