4

Relation#update(id, attributes)ドキュメントには、「オブジェクトがデータベースに正常に保存されたかどうかに関係なく、結果のオブジェクトが返される」と記載されてRelation#update_all(updates, conditions = nil, options = {})いますが、インスタンス化、コールバック、または検証は行われない (ストレート DB クエリ) と記載されています。

簡単な性能テストを実行して に置き換えるRelation#updateRelation#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)
  • レール 3.2.8

UPDATE - 比較のためのいくつかの基本的な数値: 起動された約 700 の更新ステートメントでは、約 0.6MB (ステートメントごとに 0.8kB) の差があります。

更新 2 - @philip-hallstrom の提案に従って AREL チェーンを削除しました。メモリ フットプリントがわずかに減少しましたが、それでもMyModel.update_all(attrs, conditions)よりも多くのメモリを消費していますMyModel.update(id, attrs)

4

1 に答える 1

0

あなたがする場合、違いはありますか:

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

あまり掘り下げませんでしたが、 update_all がすぐに Arel を呼び出しているようです。私は面倒を見るのをやめて、.update -> .update_attributes -> .assign_attributesArel をまったく見ていませんでした。

推測するなら、それが理由だと思います。

これはどこかでループしていると思いますか?それ以外の場合は、次のようにしてください。

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

于 2012-11-02T00:33:49.447 に答える