如何改进ActiveRecord查询

时间:2013-02-12 20:25:13

标签: ruby-on-rails ruby rails-activerecord worker sidekiq

我有一个返回查询结果的方法。然后调用该方法的代码遍历每个结果并启动sidekiq worker。我遇到的问题是循环实际上占用了相当多的时间(几乎与运行所有工作者所花费的时间相同)。这是查询:

Object.where("last_updated > ?" , 1.days.ago.midnight )

然后我执行以下操作:

objects.each { |o| o.perform_async(something) }

我正在试图弄清楚如何使这个过程更有效率。结果是这个过程需要大约10分钟才能完成,每次启动有效地花费20毫秒(如果查询返回30,000个结果)。有没有办法让这更快?

1 个答案:

答案 0 :(得分:0)

我看到你已经索引了last_updated。下一个:

Object.select('id, only_columns_you_need').where(...).find_each do |object|
  object.perform_async(something)
end

如果“objects”表有很多列,但是你只需要一些这样的操作,那么选择只有那些可以真正加快db和Ruby领域的速度。

默认情况下,

find_each将以1000个批次加载记录。使用:batch_size选项进行调整。

<强>更新

def do_stuff_to_objects(&stuff)
  Object.select('id, only_columns_you_need').where(...).find_each(&stuff)
end

...

do_stuff_to_objects do |object|
  object.perform_async(something)
end