求 ActiveRecord 中最好的全表扫描方法?我在生产环境的服务器上要跑个脚本,内容是遍历某表中每一条纪录,调用该纪录的某个方法,如果这个方法返回 nil,输出这条纪录的 id,本来用 Model.all.each 就行的,不过由于数据量较大,有两千万条,并且这个方法里内容也不是特别简单,需要多次 join,所以直接这么跑我担心会出事情,因此请教大家该怎么遍历才好,谢谢!
看看 Model.find_each 能满足你的要求吗? http://guides.rubyonrails.org/active_record_querying.html
#1 楼 @aston 这个方法好 谢谢!
#2 楼 @iBachue #1 楼 @aston
昨天刚刚好也处理一个类似的问题,find_each 和 find_in_batches 在两千万条记录前,可能都是浮云。真正高效解决这个办法的是 Raw SQL:
find_each
find_in_batches
SELECT id FROM table_name WHERE column_name is NULL;
一个比较土的办法是每次只取少量记录处理,然后 sleep 一会再继续 - -
人家说了要调用一个方法,原始 sql 怎么行