我有一个返回查询结果的方法。然后调用该方法的代码遍历每个结果并启动sidekiq worker。我遇到的问题是循环实际上占用了相当多的时间(几乎与运行所有工作者所花费的时间相同)。这是查询:
Object.where("last_updated > ?" , 1.days.ago.midnight )
然后我执行以下操作:
objects.each { |o| o.perform_async(something) }
我正在试图弄清楚如何使这个过程更有效率。结果是这个过程需要大约10分钟才能完成,每次启动有效地花费20毫秒(如果查询返回30,000个结果)。有没有办法让这更快?
答案 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