使用ActiveRecords和Rails获取大量记录的最快方法(find_each很慢)

时间:2013-02-14 08:24:55

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord

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

  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还是其他什么,但如果你能给我任何提示,让它更快,我将非常感激。

提前致谢

3 个答案:

答案 0 :(得分: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

更新:

Anand提到了Rails Performance Tip: Query Optimization

同时检查QueryReviewer gem

除此之外,还有很多因素可以加速某些人的表现 帖子Active Record Query Interface Optimization中的内容。

答案 1 :(得分:0)

在模型中使用find_by_sql子句。

答案 2 :(得分:0)

我想到了两个选择:

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

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