使用条件查询优化Rails update_all

时间:2016-01-22 11:35:06

标签: ruby-on-rails postgresql activerecord

我正在尝试为500k甚至更多现有记录更新新属性的值。

在迁移时,现有记录将该属性值设置为nil,我希望将其设置为false。

首先,我在种子文件中尝试了这个:

non_selected = Bonus.active.ranked.find(:all, conditions: { selected: nil })
non_selected.each { |b| b.update_attribute(:selected, false) }

但这很慢。在基准测量中,这需要大约140s的10k奖励记录。

现在,我改为:

Bonus.active.ranked.update_all( "selected = false", "selected IS NULL" )

对于10k记录需要0.13秒。

但是对于400k记录,更新所有记录需要10秒。

如何改进此查询?

0 个答案:

没有答案