批量执行rails查询



我有一个包含500,000个条目的表A(:name, :address, :phone)。我想运行这个查询:

johns = A.where(:name => "John")

这个查询应该返回150,000个结果。但是运行这个查询得到的结果是:Killed .

我应该如何重写这个查询,以便查询在数据库中批量运行1000个?

您需要使用find_each选项batch_size

A.where(:name => "John").find_each(batch_size: 1000) do |a|
  # your code
end

使用find_each的另一种选择是使用find_in_batches

有一个明显的区别- find_each将给你的块每个项目,并将逐个项目地循环你的批处理。find_in_batches将把你的批项以数组形式传递到你的区块。

我假设你的A模型实际上被称为Address。你可以这样做:

Address.where(name: "John").find_in_batches(batch_size: 1000) do |addresses|
  # Your code that you might want to run BEFORE processing each batch ...
  addresses.each do |address|
    # Your code that you want to run for each address
  end
  # Your code that you might want to run AFTER processing each batch ...
end

正如你所看到的,这给了你更多的灵活性来处理你的批处理。但是,如果您的需求很简单,则只需坚持使用find_each

.in_batches

find_eachfind_in_batches的问题是您已经使用了查询结果。

最干净的解决方案是使用in_batches,因为它产生实际的查询(而不消耗它):
User.find_in_batches do |users|
  users.select(:id) # error
end
User.in_batches do |users|
  users.select(:id)                   # works as expected
  users.pluck("complext pluck query") # works as expected
end
 A.where(:name => "John").find_each(batch_size: 1000) do |a|
    # your code
 end

相关内容

  • 没有找到相关文章

最新更新