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ぐらいになった。それでも遅いけど一旦解決。
何故だかわからんけど、同じようにハマってる人の知見になればいいな。