Find_each批次之间需要约30分钟

时间:2016-02-19 00:48:01

标签: ruby-on-rails postgresql activerecord heroku

我有260万条记录,我试图为其生成公共ID。在当地最多花了3个小时。

在heroku上运行rake任务需要相当长的时间:

Episode.where(public_id: nil).find_each do |e|
  Rails.logger.info "updating #{e.id} ..."          
  e.set_public_id
  e.save
end

set_public_id只需生成代码并检查它是否重复:

code = generate_code
self.public_id = code
dupe = self.class.where(public_id: self.public_id)

查看记录器输出,似乎每隔约30分钟完成一批1000次。我在创建列时向:public_id添加了一个索引。

我可以做些什么来加快速度?

2 个答案:

答案 0 :(得分:0)

我认为find_each默认批量大小对于heroku来说太多了。最终使其工作的是将批量大小减少到' 100'

.find_each(batch_size: 100)

答案 1 :(得分:0)

确定find_each中的批次大小是一个很好的决定,因为默认的批次大小为1000,所以您还可以做的另一件事是将其与.lazy,{{1} }