Amazon Redshift便利ツール『amazon-redshift-utils』の便利SQLスクリプト紹介(AdminScripts編)

2015.06.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Redshiftでは日々の作業を行う上で様々な情報を必要とし、その過程で『こういう情報が欲しい』という局面が多々あります。当ブログでも適宜『便利系SQL』として必要な情報を取得する為のSQLをご紹介して来ましたが、以下のGitHub上で展開されている各種スクリプトがとても有用そうでしたので2回に分けて中身を見てみたいと思います。当エントリは『管理系スクリプト(AdminScripts)』に関する内容となります。

目次

commit_stats.sql

COMMIT文を介して、消費量に関する情報を表示します。過去2日間のコミットキュー統計を返します。

current_session_info.sql

現在実行中のクエリとのセッションについての情報を表示します。

filter_used.sql

テーブルスキャン時に適用されるフィルタの情報を返します(過去7日間分)。ソートキーを選択する上での有用な情報となります。

select
  trim(s.perm_Table_name) as table ,
  substring(trim(info),1,180) as filter,
  sum(datediff(seconds,starttime,endtime)) as secs,
  count(*) as num,
  max(i.query) as query  
from stl_explain  p
join stl_plan_info i on ( i.userid=p.userid  and i.query=p.query and i.nodeid=p.nodeid  ) 
join stl_scan s on (s.userid=i.userid and s.query=i.query and  s.segment=i.segment and  s.step=i.step) 
where  s.starttime > dateadd(day, -7, current_Date)
  and   s.perm_table_name not like 'Internal Worktable%'
  and p.info <> ''
  and s.perm_table_name like '%' -- chose table(s) to look for
group by 1,2 order by 1, 4 desc , 3 desc;

missing_table_stats.sql

"missing statistics"というフラグが立っているEXPLAINプランを表示します。

perf_alert.sql

直近1週間の中で出現したパフォーマンス上の"アラート"について表示します。このクエリについてはより有用そうなので項目に関する情報を付記してみます。

項目 説明
table 対象テーブル名
minutes アクションに掛かった分数。(※全てのアラートで出る訳ではない模様)
rows scan/dist/bcastの対象行数
event アラートイベント名
solution アラート及びパフォーマンスの問題を避けるために提案される解決策
sample_query アラートが出現した直近のquery_id
count アラートの出現数
select
    trim(s.perm_table_name) as table ,
    (sum(abs(datediff(seconds, coalesce(b.starttime,d.starttime,s.starttime),coalesce(b.endtime,d.endtime,s.endtime))))/60)::numeric(24,0) as minutes,
    sum(coalesce(b.rows,d.rows,s.rows)) as rows,
    trim(split_part(l.event,':',1)) as event,
    substring(trim(l.solution),1,60) as solution,
    max(l.query) as sample_query,
    count(*)
from stl_alert_event_log as l
  left join stl_scan as s on s.query = l.query and s.slice = l.slice and s.segment = l.segment
  left join stl_dist as d on d.query = l.query and d.slice = l.slice and d.segment = l.segment
  left join stl_bcast as b on b.query = l.query and b.slice = l.slice and b.segment = l.segment
where l.userid >1
      and  l.event_time >=  dateadd(day, -3, current_Date)
group by 1,4,5 order by 2 desc,6 desc;

queuing_queries.sql

WLMクエリスロットを待機しているクエリを示します。

table_info.sql

テーブルのストレージ情報(サイズやスキュー等)を返します。SVV_TABLE_INFOで得られる情報と近いものがある感じです。

top_queries.sql

過去7日間で『最も時間の掛かったSQL文TOP50』を返します。

上記GitHub上のSQLを実行してみましたが一部エラーが出る模様。SQL文で検索を掛けてみたところAWS公式でも同種のSQLが紹介されていましたのでこちらのリンクを展開しておきます。こっちのページでも"使える"SQLがまとめられていますね。

select
    trim(database) as db,
    count(query) as n_qry,
    max(substring (qrytext,1,80)) as qrytext, 
    min(run_minutes) as "min" , 
    max(run_minutes) as "max", 
    avg(run_minutes) as "avg",
    sum(run_minutes) as total,  
    max(query) as max_query_id, 
    max(starttime)::date as last_run, 
    sum(alerts) as alerts,
    aborted
from
  (select
      userid,
      label,
      stl_query.query, 
      trim(database) as database, 
      trim(querytxt) as qrytext, 
      md5(trim(querytxt)) as qry_md5, 
      starttime,
      endtime,
      (datediff(seconds, starttime,endtime)::numeric(12,2))/60 as run_minutes,
      alrt.num_events as alerts,
      aborted 
    from stl_query
        left outer join (select query, 1 as num_events from stl_alert_event_log group by query ) as alrt
        on alrt.query = stl_query.query
where
    userid <> 1 and starttime >=  dateadd(day, -7, current_date)) 
group by
    database, label, qry_md5, aborted
order by
    total desc limit 50;

まとめ

以上、管理系スクリプトに関する『amazon-redshift-utils』のご紹介でした。この辺りのスクリプトを使えば更にRedshift業務が捗りますね!同時投稿の以下エントリでは『管理ビュー(AdminViews)』についても書いていますので併せてご覧頂けますと幸いです。こちらからは以上です。