次のようなSQL文があります。
こちらのSQLでは、INNER JOINしているテーブル及び、WHERE文で対象としているテーブルは、2つしかありません。
これでしたら10秒ほどで、集計が完了します。
しかし、今回の要件上、INNER JOINするテーブル数は、12個あり、
同様にINNER JOINとWHERE文を追加していき実行すると、1時間以上かかってしまいます。
sql
1 2SELECT artists.user_id, artists.staff_id, 3Sum(events.sum),\ 4Sum(goods.sum),\ 5FROM artists\ 6INNER JOIN `events` ON `artists`.`id` = `events`.`artist_id`\ 7INNER JOIN `goods` ON `artists`.`id` = `goods`.`artist_id`\ 8WHERE (`events`.`created_at` BETWEEN '2017-01-01' AND '2017-07-30')\ 9AND (`goods`.`created_at` BETWEEN '2017-01-01' AND '2017-07-30')\ 10GROUP BY artists.user_id, artists.staff_id; 11 12
SQLの速度改善をしたいのですが、これ以上絞り込む条件がないため、
SQL文の見直しにより、改善できる方法を探しております。
尚、バッチ処理にするという案は今回の要件上NGでした。
生のSQL文で記述しておりますが、実際はRuby on Railsのアプリケーション上で実行します。
その為、非同期処理というのも模索しておりますが、今回、集計した結果をDBにINSERTするため、
非同期処理にすると、本来データが入ってほしいレコードにデータが入らないという恐れを懸念しております。
INNER JOIN を LEFT OUTER JOIN にしたり等、不勉強ながら試行錯誤しておりますが、なかなか改善につながりません。
理想は1~2分で完了してほしいです。
また、この集計処理は、期間を変えて実行することはあっても、同じSQL文を何度も使うということはないので、
クエリキャッシュをするというのもあまり意味がないと思っております。
また、外部キー周りにindexキーはつけております。
宜しくお願い致します。
回答6件
あなたの回答
tips
プレビュー