ある日、突然ぶつかったActiveRecordの大量Update問題
Rails4で大量レコード(数10万件)のUpdate処理を書いています。しかも似たような処理を70回前後繰り返す必要があります。
1行ずつupdateすると、アップデート文だけで日が暮れちゃいます。
Insertなら、軽い軽いですが
insertするときは、bulk insertのgemがあって助かりました。
gem 'activerecord-import'
bulk updateで調べよう
activerecord-import gemで"bulk update"が実現できますが、ON DUPLICATE KEY UPDATEを使っているため、MySql限定サービスらしいです。
ネットで「ActiveRecord bulk update」を調べてもいい回答がなく、もう降参だ!、と思いました。
ひらめき
そのとき、update_all関数が目に留まりました。なるほど、だからbulk updateのgemがないわけですね。そもそもupdate_allがあるから。
conditions.each_slice(1000) do |sliced_conditions|
SomeModel.where(condition_field: sliced_conditions).update_all(field_to_be_update: value_to_set)
end
で悩んでいたbulk updateを実現できました。
each_sliceを使うのがSQLでINリストの上限オーバーを回避するため
独り言
なるほど、そもそも、bulk updateって必要ないわけないですね。