環境
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 件のコメント:
コメントを投稿