0

ユーザーのID、ユニット、サイズなどのデータを含むCSVファイルがあります。

member_id500,000 個の製品を更新したい:

500000.times do |i|
  user = User.find(id: tmp[i])

  hash = {
    unit: tmp[UNIT],
    size: tmp[SIZE]
  }
  hash.merge!(user_id: user.id)  if user.present?

  Product.create(hash)
end

各 User オブジェクトを見つけるのではなく、関連するハッシュの配列を取得するようにその手順を最適化するにはどうすればよいですか?

4

1 に答える 1

4

ここには、パフォーマンスを大幅に妨げている 2 つの要因があります。User.findまず、完全に制御不能なN 回の呼び出しを行っています。次に、それぞれが独自の小さなトランザクション ブロック内で実行される大量挿入を行う代わりに、個々のレコードを作成しています。

一般に、これらの種類の一括操作は、純粋に SQL ドメインで行う方が適切です。非常に多数の行を同時に挿入できますが、多くの場合、送信できるクエリのサイズによってのみ制限され、そのパラメーターは通常調整可能です。

巨大なクエリはデータベースを一定期間ロックまたはブロックする可能性がありますが、更新を行う最速の方法です。大量の挿入中にシステムを実行し続ける必要がある場合は、一連の小さなコミットに分割する必要があります。

Product.connectionこれは、クエリを使用してデータを直接操作できる、より低レベルのアクセス レイヤーであることを忘れないでください。

于 2013-08-01T14:42:29.887 に答える