Tôi đang tạo một bảng mới cần được chèn lấp bằng dữ liệu dựa trên tài khoản Người dùng (trên vài chục nghìn) với tác vụ cào một lần sau đây.Bạn nên chèn lấp một bảng mới trong Rails như thế nào?
Điều tôi quyết định làm là tạo một chuỗi INSERT lớn cho mỗi 2000 người dùng và thực hiện truy vấn đó.
Đây là những gì các mã khoảng trông giống như:
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
Vì vậy, tôi tự hỏi, là có một cách tốt hơn để làm điều này? Một số hạn chế của phương pháp tôi đã thực hiện là gì? Tôi nên cải thiện nó như thế nào? Điều gì sẽ xảy ra nếu tôi không cắt mảng inserts
và chỉ cần thực hiện một đơn INSERT
với hơn một vài chục nghìn bộ dữ liệu? Những hạn chế của phương pháp đó là gì?
Cảm ơn!
Tại sao bạn không sử dụng các phương thức MyNewTable được bao bọc trong giao dịch để tăng tốc độ chèn? Ngoài ra, việc triển khai hiện tại sẽ mở bạn đến SQL injection. –
Ồ, tôi nhớ bạn đang thực hiện nhiều lần chèn cùng một lúc. Điều đó thực sự sẽ nhanh hơn (nhưng không chắc chắn bao nhiêu nếu bạn bao bọc chèn bình thường trong một giao dịch nói 1000 mỗi. –