2

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

ここで何が間違っているのかわかりませんが、確かなことは、これは非常に遅いことです。これを高速化します。

前もって感謝します

4

3 に答える 3

3

2 つのことが起こっています。

最初は選択クエリです-

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

2 つ目は、それぞれに作成することです。

@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 Performance Tip: 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 に答える