Rails Relation#update_all比Relation#update消耗更多内存

时间:2012-11-01 17:43:25

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

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

运行简单的性能测试并将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)更多。

1 个答案:

答案 0 :(得分:0)

如果你这样做会有所不同:

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})