gpt4 book ai didi

ruby-on-rails - Active Record in_batches 与 find_in_batches

转载 作者:行者123 更新时间:2023-12-05 08:26:06 27 4
gpt4 key购买 nike

我想对数据库中的数百万条记录执行批量操作。

根据ActiveRecord的文档,有两种方法可以进行批量操作,分别是#find_in_batches & #in_batches。但是,除了一个返回 Enumerator 而另一个返回 ActiveRecord Relation 之外,我似乎找不到它们之间的任何区别。

因此,考虑到它们具有不同的性能,我想知道在哪种情况下哪种性能更好。而且,除了原始 SQL 之外,还有更好的方法来有条件地更新数百万行吗?

最佳答案

简而言之,find_in_batches 生成每批找到的记录,而in_batches 生成ActiveRecord::Relation对象。

所以下面的代码:

Post.find_in_batches do |group|
group.each { |post| puts post.title }
end

每批处理只会向数据库发送一个查询,以检索该批处理的所有帖子数据:

SELECT "posts".* FROM "posts" WHERE ...

但是:

Post.in_batches do |group|
group.each { |post| puts post.title }
end

每批将向数据库发送两个查询。获取该批处理的帖子 ID 的第一个查询:

SELECT "posts"."id" FROM "posts" WHERE ...

第二个查询获取该批处理的所有帖子数据:

SELECT "posts".* FROM "posts" WHERE ...

更多详情:

如果您查看这两个函数的源代码 here ,您会看到 find_in_batches 实际上调用 in_batches 并在参数中传递了 load: true。但是,in_batchesload 的默认值为 false

如果您在 in_batches 中进一步查看使用 load 值的部分,它将如下所示:

        if load
records = batch_relation.records
ids = records.map(&:id)
yielded_relation = where(primary_key => ids)
yielded_relation.load_records(records)
else
ids = batch_relation.pluck(primary_key)
yielded_relation = where(primary_key => ids)
end

原始解释可以在这里找到:https://www.codehub.com.vn/Difference-between-find_in_batches-vs-in_batches-in-Ruby-on-Rails

关于ruby-on-rails - Active Record in_batches 与 find_in_batches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58485706/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com