0

私は選択ステートメントを持っています、

SELECT `metrics`.* 
FROM `metrics` 
WHERE `metrics`.`engine` = 0 
  AND (`metrics`.connection_id = 27874) 
  AND (`metrics`.`id` > 181586235) 
ORDER BY `metrics`.`id` ASC LIMIT 1000

find_eachこれは、リレーション (例: ) で呼び出されることによって生成されmetric.engines.find_eachます。この select ステートメントは、実行されるたびに 1,500 万件のレコードをスキャンします。

s の範囲のみを検索するようにクエリに指示することで、データベースでこれを軽くしたいと思いますmetrics.id(例: metrics.id > 1 AND metrics.id < 1000)。

これを行う方法はありfind_eachますか?

4

1 に答える 1

1

find_eachすべてのファインダー メソッドと同様に、スコープに適用できます。

Metric.where("metrics.id between 1 and 1000"]).find_each { ... }

編集: すべてのレコードを処理する必要があるが、一度にすべてをロードしたくない場合は、find_in_batchesメソッドを使用できます。

Metric.find_in_batches do |batch|
  batch.each { ... }
end 
于 2012-11-07T21:58:54.857 に答える