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