0

我有一个 CSV 文件,其中包含用户 ID、单位和大小等数据。

我想更新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

如何优化该过程以不找到每个用户对象,但可能会获得相关哈希数组?

4

1 回答 1

4

这里有两件事极大地阻碍了性能。首先,您正在进行 NUser.find次呼叫,这完全失控。其次,您正在创建单独的记录,而不是进行大量插入,每个记录都在自己的小事务块内运行。

一般来说,这些类型的批量操作最好在 SQL 域中完成。您可以同时插入大量行,通常只受您可以提交的查询大小的限制,并且该参数通常是可调整的。

虽然一个巨大的查询可能会锁定或阻塞您的数据库一段时间,但这将是进行更新的最快方式。如果您需要在批量插入期间保持系统运行,则需要将其分解为一系列较小的提交。

请记住,这Product.connection是一个更底层的访问层,允许您通过查询直接操作数据。

于 2013-08-01T14:42:29.887 回答