.log(ぽちろぐ)

退屈しているおっさんの日記

SQLチューニングした件

「処理がクソ遅いので調べてくれ」

  • ログを見ると、どうやらSQLが遅い。
  • そのSQLはUnionAllとLeftJoinを繋げて、まぁまぁ巨大になってる。 UnionAllをバラして実行していくと、どうやら、leftJoinが遅い。

 選手毎の得点率(2020年)を出したいので、こんなSQLを書いてる。(これはフェイク。要は、率を出すために母数と実績を得たい)

select sd.id 選手ID、sum(sd.打席数) 通算打席、sum(coalesce(ss.打点)) 通算打点
from (select * from 選手打席 where year='2020') sd
left join (select * from 選手打席 where year='2020') ss
   on sd.id = ss.id
group by sd.id

 設計に対して、やってることは誤ってない。実行計画で問題ないので、indexは大丈夫そう。
 leftJoinを外して、打席数だけ、打点だけを得るのは速いので、leftJoinが遅い。

 誤ってないけど、違和感があるなあ……あ!?
 普通はjoin句のあとに、whereで絞り込む、よね? 流派の違いなのかなあ?

select sd.id 選手ID、count(sd.id) 通算打席数、sum(ss.打点) 通算打点
from (select id 打席数 from 選手打席 where year='2020') sd
left join (select id, 打点 from 選手打席 where year='2020') ss
   on sd.id = ss.id
where sd.year = '2020' -- where句を追記
group by sd.id

 joinのあとにwhere句を継ぎ足したら、なぜか速くなった。1.8secぐらいかかってたSQLが、0.4secぐらいになった。

 UnionAllしてるもとのSQLに組み込むと、18minぐらいかかっていたSQLが、18secぐらいになった。それでも遅いけど一旦解決。

 何故だかわからんけど、同じようにハマってる人の知見になればいいな。