2012-11-01 20 views
4

Relation#update(id, attributes) docs提到“无论对象是否成功保存到数据库,返回结果对象”,而Relation#update_all(updates, conditions = nil, options = {})指出没有实例化,回调或验证(直接DB查询)。Rails Relation#update_all消耗的内存比Relation#更新

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

任何解释?

摘录:

#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

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

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

+0

我们在谈论的内存有多大的差异? –

+0

用一些数字更新了这个问题 – tamersalama

回答

0

有没有,如果你做一个区别:

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

我没有挖得太远,但它看起来像update_all调用阿雷尔了蝙蝠的权利。我停止了照顾.update -> .update_attributes -> .assign_attributes,并没有看到Arel,尽管我确信它必须在某个时候发挥作用。如果我不得不猜测,我会说这就是为什么。

我认为这是在一个循环的某个地方?否则,为什么不这样做:

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

+0

我将在星期一测试 – tamersalama

+0

略有改进,但仍然是'MyModel.update_all(attrs,conditions)'消耗的内存比'MyModel.update(id,attrs)'多。将更新问题。 – tamersalama