Aşağıdaki bir kerelik komisyon göreviyle Kullanıcı hesaplarına (birkaç düzineden fazla bin) dayanan verilerle doldurulması gereken yeni bir tablo oluşturuyorum.Rails'de yeni bir tabloyu nasıl doldurmalısınız?
Yapmaya karar verdiğim her 2000 kullanıcı için büyük bir INSERT dizesi oluşturmak ve bu sorguyu yürütmek. Bunu yapmak için daha iyi bir yol yoktur,
task :backfill_my_new_table => :environment do
inserts = []
User.find_each do |user|
tuple = # form the tuple based on user and user associations like (1, 'foo', 'bar', NULL)
inserts << tuple
end
# At this point, the inserts array is of size at least 20,000
conn = ActiveRecord::Base.connection
inserts.each_slice(2000) do |slice|
sql = "INSERT INTO my_new_table (ref_id, column_a, column_b, column_c) VALUES #{inserts.join(", ")}"
conn.execute(sql)
end
end
Yani, merak ediyorum:
İşte kod kabaca böyle görünüyor? Aldığım yaklaşımın bazı dezavantajları nelerdir? Bunu nasıl geliştirmeliyim? inserts
dizisini dilimlemediysem ve sadece bir çift düzine bin VALUES tupleli tek bir INSERT
uyguladıysam ne olur? Bu yöntemin sakıncaları nelerdir?
Teşekkürler!
Neden ekleri hızlandırmak için bir işlemde sarılmış MyNewTable yöntemlerini kullanmıyorsunuz? Ayrıca, mevcut uygulama sizi SQL enjeksiyonuna açar. –
Oh, bir kerede birden çok ekleme yaptığınızı kaçırdım. Bu gerçekten daha hızlı olacaktır (ancak her biri 1000 kelimelik bir işlemde normal ekler eklediğinizde ne kadar emin olacağınızdan emin olamazsınız. –