运行一个rails批量查询
Run a rails query in batches
我有一个 table A(:name, :address, :phone)
包含 500,000 个条目。我想 运行 这个查询 :
johns = A.where(:name => "John")
此查询应 return 150,000 个结果。但是 运行ning 这个查询给了我这个结果:Killed
.
我应该如何重写此查询,以便查询 运行 数据库中 1000 批次的查询?
您需要使用带有选项 batch_size 的 find_each
。
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
.
A.where(:name => "John").find_each(batch_size: 1000) do |a|
# your code
end
.in_batches
find_each
或 find_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
我有一个 table A(:name, :address, :phone)
包含 500,000 个条目。我想 运行 这个查询 :
johns = A.where(:name => "John")
此查询应 return 150,000 个结果。但是 运行ning 这个查询给了我这个结果:Killed
.
我应该如何重写此查询,以便查询 运行 数据库中 1000 批次的查询?
您需要使用带有选项 batch_size 的 find_each
。
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
.
A.where(:name => "John").find_each(batch_size: 1000) do |a|
# your code
end
.in_batches
find_each
或 find_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