我有一个包含超过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还是其他什么,但如果你能给我任何提示,让它更快,我将非常感激。
提前致谢
答案 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中编写查询并将其放入存储过程并调用该过程。