【发布时间】:2019-10-21 11:49:09
【问题描述】:
我想对数据库中的数百万条记录执行批处理操作。
根据 ActiveRecord 文档,有两种方法可以执行批处理操作,即#find_in_batches & #in_batches。但是,除了一个返回 Enumerator 而另一个返回 ActiveRecord Relation 之外,我似乎找不到它们之间的任何区别。
因此,考虑到它们具有不同的性能,我想知道在哪种情况下哪个性能更好。而且,除了原始 SQL 之外,还有没有更好的方法来有条件地更新数百万行?
【问题讨论】:
-
使用
.update_all并一次更新所有行总是比将记录从数据库中拉出并逐个更新一个数量级要好。如果可能的话,这绝对是您的首选。 -
我首先要问,如果一个总是比另一个更好,为什么他们会公开这两种方法(仅仅因为一个调用另一个并不意味着它的性能较低,它只取决于用例) .正如@max 所说,
update_all是首选。如果您遇到一些问题(超时等),那么跨多个工人的批次可能是值得关注的。 -
#in_batches是一个较低级别的函数,可用于构建#find_in_batches之类的东西无论如何,这就像将两个马品种与太空船进行比较。不要害怕一点原始的sql。它不会自动邪恶。 -
“因为要更新的值是基于行的动态”——这听起来像是实际上可以用 SQL 完成的事情。您可以使用子查询、函数、横向连接等。
-
取决于数据库,但在 postgres 上,您可以使用外部数据包装器 (FDW) 连接驻留在另一个数据库上的表,就好像它在同一个数据库上一样。
标签: ruby-on-rails activerecord