我有很多的,我試圖剔除掉重複的記錄,要做到這一點,我目前正在運行的這一點:如何加快此代碼塊的速度?
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
只能有一個響應。所以,如果有重複,它會銷燬重複。
過了幾十萬行,就是很慢很慢。
那麼,我該如何加快這個過程呢?
下面是SQL調用每個那些:
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提示,問問自己,你真的需要在所有查詢中執行SELECT *嗎?不幸的是,我不知道任何Ruby或RoR可以幫助你進一步:( – 2012-01-10 17:21:30
你可以嘗試使用散列來跟蹤你已經看到的answer_id而不是數組,你可能還想嘗試添加一些include和使用find_each,而不是每一個都放在最外層的循環中(否則你會保留以前在ram中駐留的對象)。顯然,確保你在所有適當的列上都有索引。將'r.answer.blank?'改爲'r。 answer_id.blank'會節省很多查詢(但是如果你沒有外鍵意味着你不會捕獲'dangling'answer_id – 2012-01-10 17:31:08
嘗試在事務中包裝整個粉碎('Survey.transaction do' ... 'end')。這可以讓Postgresql變得更快。另外,看看你是否可以使用psql直接驅動postgres進行清理,繞過rails/activerecord。 – 2012-01-10 19:06:57