私は取り除くために、そして、私は現在、これを実行していることをやろうとしている重複するレコードがたくさんあります、すべてのアクティブな調査を見つけこのコードブロックを高速化するにはどうすればよいですか?
Survey.active.each do |survey|
survey.response_sets.completed.each do |set|
answer_ids = []
set.responses.each do |r|
if r.answer.blank?
r.destroy
else
if answer_ids.include? r.answer_id
r.destroy
else
answer_ids << r.answer_id
end
end
end
end
end
を各調査の応答セットを取得します、各応答セットの個々の応答を入力します。
次に、応答セット内の別の応答のためにanswer_id
が存在する場合に、応答が重複であるかどうかを調べます。与えられた応答セット内には、与えられたanswer_id
に対して1つの応答のみが存在することができる。したがって、重複がある場合、重複を破棄します。
数十万行を超えると、が非常に遅くなります。
どのように処理速度を上げることができますか?
Survey.active
SELECT "surveys".* FROM "surveys" WHERE "surveys"."active" = 't'
survey.response_sets.completed
SELECT "response_sets".* FROM "response_sets" WHERE ("response_sets".survey_id = 12345) AND (completed_at IS NOT NULL)
set.responses
SELECT "responses".* FROM "responses" WHERE ("responses".response_set_id = 54321)
私はRailsの3.0.6とPostgreSQLを実行している:ここで
は、SQLは、それらのそれぞれを求めています。
一般的なSQLのヒントは、本当にすべてのクエリで 'SELECT *'を実行する必要があるのでしょうか?残念ながら、私はRubyやRoRを知っていません。( –
あなたは配列ではなく既に見たanswer_idsを追跡するためにハッシュを試してみることができます。また、いくつかのインクルードを追加してfind_eachを使うこともできます。 (もしそうでなければ、あなたは以前にramに常駐していたオブジェクトを保持しています)明らかに、適切なすべてのカラムにインデックスが付いていることを確認してくださいr.answer.blank?を 'rに変更する。 answer_id.blank'はたくさんのクエリを保存します(ただし、外部キーを持たない場合は、 'dangling' answer_idsをキャッチしません) –
トランザクション内でスマッシュ全体をラップしようとします( 'Survey.transaction do' ... Postgresqlをもっと速くすることができます。また、psqlを使ってpostgresをrails/activerecordをバイパスしてクリーンアップに直接送ることができるかどうかを確認してください。 –