2

我有一个包含超过 50 万条记录的表,我现在正在以这种方式获取数据:

  Account.find_each(:conditions =>{:status =>STATUS[:waiting]}) do |user|    
    unless user.games.include? game
      begin
        user.account_games.create!(:game_id => game.id,:status  => STATUS[:waiting])
        user.activate            
      rescue Exception => e
        $LOG.error "Error : #{e.to_s}"
      end          
    end
  end

现在我不确定我在这里做错了什么,但可以肯定的是,这很慢,我不知道是 find_each 还是其他任何东西,但如果你能给我任何提示,我将不胜感激使这更快。

提前致谢

4

3 回答 3

3

发生了两件事:

首先是选择查询-

 @account = Account.where(:status =>STATUS[:waiting])

其次是在每个上创建-

@account.each do |user|

 unless user.games.include? game
      begin
        user.account_games.create!(:game_id => game.id,:status  => STATUS[:waiting])
        user.activate            
      rescue Exception => e
        $LOG.error "Error : #{e.to_s}"
      end          
    end  
  end

更新:

有一个著名的Rails 性能提示:Query Optimization by Anand.

还要检查QueryReviewer gem

除此之外,还有许多因素可以提高性能,例如Active Record Query Interface Optimization中的一些因素。

于 2013-02-14T08:32:05.230 回答
0

对您的模型使用 find_by_sql 子句。

于 2013-02-16T11:59:18.123 回答
0

我想到了2个选项:

1) 在 Active Record 中全选然后使用 ruby​​ 进行迭代,将需要大量内存。

2)用sql编写查询并将其放入存储过程并调用该过程。

于 2014-03-03T12:57:11.567 回答