連絡先を、関連するサブスクリプションを持つコレクションとしてグループ化しました。これらのサブスクリプションは非常に頻繁に作成および削除されます...
各連絡先コレクションには、約30.000〜50.000のオブジェクトを含めることができます。
30.000の連絡先のサブスクリプションを作成するとき、連絡先コレクションを繰り返し処理し、SQL値の配列を入力します。その後、これらすべての値を使用して単一のsqlinsertステートメントを手動で実行します。
sql_values = []
contacts.each do |contact|
sql_values << ["(#{contact.id}, #{newsletter.id}, #{contact_group_id})"]
end
if sql_values.any?
ActiveRecord::Base.connection.execute(
"INSERT INTO subscriptions (contact_id, newsletter_id, contact_group_id) VALUES #{sql_values.join(", ")}"
)
sql_values = nil
end
SQLの挿入には1秒ほどかかりますが、それで問題ありません。私の開発マシン(8GB RAM)では、連絡先の選択に約15秒かかります。本番マシンには1GBのRAMが搭載されています...
その時間を短縮するためのあなたのアプローチは何でしょうか?
編集:私の問題は、連絡先をタグテーブルに結合するacts_as_taggableです。オブジェクトにタグを付けて大きなコレクションを処理するための優れたソリューションを知っている人はいますか?
ありがとうございました!