gpt4 book ai didi

ruby-on-rails - Rails Relation#update_all 比 Relation#update 消耗更多的内存

转载 作者:数据小太阳 更新时间:2023-10-29 07:39:46 29 4
gpt4 key购买 nike

Relation#update(id, attributes) 文档提到“无论对象是否成功保存到数据库,都会返回结果对象。”,而 Relation#update_all (updates, conditions = nil, options = {}) 表示没有进行任何实例化、回调或验证(直接数据库查询)。

运行一个简单的性能测试并将 Relation#update 替换为 Relation#update_all,看起来内存消耗增加了。

有什么解释吗?

摘录:

#Before
MyModel.update(my_hash['id'], special_attrs)

#After (more memory consumed)
MyModel.where(:id => my_hash['id']).update_all(special_attrs)

#Update-2 (slightly more memory consumed than with update(id, attrs)
MyModel.update_all(special_attrs, {:id => my_hash['id']})
  • Windows XP(是的 - 我知道)
  • JRuby 1.6.8 (1.9)
  • rails 3.2.8

更新 - 一些用于比较的基本数字:对于大约 700 条更新语句,差异约为 0.6MB(每条语句 0.8kB)

更新 2 - 根据@philip-hallstrom 的建议删除了 AREL 链接。内存占用略有减少,但 MyModel.update_all(attrs, conditions) 消耗的内存仍然比 MyModel.update(id, attrs) 多。

最佳答案

这样做有区别吗:

MyModel.update_all(special_attrs, {:id => my_hash['id']})

我没有深入挖掘,但看起来 update_all 立即调用了 Arel。我不再关注 .update -> .update_attributes -> .assign_attributes 并且根本没有看到 Arel,尽管我确信它一定会在某个时候发挥作用。

如果非要我猜的话,我会说这就是原因。

我假设这是在某处循环?否则,为什么不这样做:

MyModel.update_all(special_attrs, {:id => all_my_hash_ids_as_an_array})

关于ruby-on-rails - Rails Relation#update_all 比 Relation#update 消耗更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13182644/

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