環境
Ruby 1.9.3-p327
Rails 3.2.2
Postgresql 9.2.2
以前、Rails CSVインポートっての書いたけど…
def create require 'csv' if params[:upload_file].blank? == false reader = params[:upload_file].read CSV.parse(reader) do |row| file = File.new file["field_name"] = row[0] file.save ← ここがマズイ end end end
これだと鬼の様にInsertクエリが走ります…
なので、BulkInsertを使いましょうw
Gemfile
gem "activerecord-import", ">= 0.2.0"
修正後
def create require 'csv' if params[:upload_file].blank? == false reader = params[:upload_file].read files = [] CSV.parse(reader) do |row| files << File.new(field_name: row[0]) end File.import(files) end end
これでInsertクエリが一発走っておしまいヘ(^o^)ノ
10,000レコードのインポートで5218.9ms
実はdestroy_allでも同じ現象…
鬼の様にDeleteクエリが走ります…
こんな感じ?
ids = [] @files = File.all @files.each do |f| ids << f.id end File.delete_all("id in (#{ids.join(',')}) ")
ちょっと強引すぎるか…( ; ゚Д゚)
1628.5ms!
これでSelect, Delete, Insertのクエリがそれぞれ一回だけ実行されるようになった
ツッコミ大歓迎ヘ(^o^)ノ
0 件のコメント:
コメントを投稿