Ruby on rails 分批运行rails查询

Ruby on rails 分批运行rails查询,ruby-on-rails,ruby-on-rails-3,performance,postgresql,cursor,Ruby On Rails,Ruby On Rails 3,Performance,Postgresql,Cursor,我有一个表a(:name,:address,:phone)由500000个条目组成。我要运行此查询: johns = A.where(:name => "John") 此查询应返回150000个结果。但运行此查询会得到以下结果:Killed 我应该如何重写此查询,以便查询在数据库中以1000个批次运行?您需要使用选项batch\u size 使用find_each的替代方法是使用find_in_batches 有一个明显的区别-find_each将为每个项目提供块,并将逐项循环处理批处理

我有一个表
a(:name,:address,:phone)
由500000个条目组成。我要运行此查询:

johns = A.where(:name => "John")
此查询应返回150000个结果。但运行此查询会得到以下结果:
Killed

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

您需要使用选项batch\u size


使用
find_each
的替代方法是使用
find_in_batches

有一个明显的区别-
find_each
将为每个项目提供块,并将逐项循环处理批处理
find_in_batches
将以数组形式将您的一批项目交付到您的区块

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

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\u each

。分批使用

 A.where(:name => "John").find_each(batch_size: 1000) do |a|
    # your code
 end
find_each
find_in_batches
的问题是您已经使用了查询结果

最干净的解决方案是批量使用
,因为它会产生实际的查询(而不使用它):

User.find_in_batch do|用户|
用户。选择(:id)#错误
结束
User.in|批量中的用户|
用户。选择(:id)#按预期工作
users.pulk(“complext pulk query”)#按预期工作
结束

我这样做了。rake任务仍在运行。但它在终端的每一行都打印以下内容。[1432551600, 1432553400, 1432555200, 1432557000, 1432558800, 1432560600, 1432562400]. 你知道会是什么吗?你给印刷的是什么?。。。我想那些是Ruby object_idI没有给打印的东西
 A.where(:name => "John").find_each(batch_size: 1000) do |a|
    # your code
 end