2012年12月20日木曜日

Rails BulkInsert and Destroy #rails

( ̄(エ) ̄)彡☆

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

コメントを投稿