1

我有一个从查询返回结果的方法。然后调用该方法的代码循环遍历每个结果并启动一个 sidekiq 工作程序。我遇到的问题是循环实际上需要相当长的时间(几乎与运行所有工作人员所需的时间相同)。这是查询:

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

然后我执行以下操作:

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

我试图弄清楚如何使这个过程更有效率。结果是完成此过程大约需要 10 分钟,每次启动实际上需要 20 毫秒(如果查询返回 30,000 个结果)。有什么办法可以让这更快吗?

4

1 回答 1

0

我看到您已经将 last_updated 编入索引。下一个:

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

如果“对象”表有很多列,但您只需要几个列来执行此操作,那么仅选择这些列可以真正加快 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
于 2013-02-13T04:52:11.503 回答