我正在尝试从 ruby 脚本将 5.6m 行插入 SQLserver db 并找到最快的方法。第一个解决方案是编写一个 SQL Insert 语句并在里面传递值
("INSERT INTO fct_coupons_distributed (coupon_campaign_id, coupon_unique_code) VALUES #{batchData}"
但当我使用 TinyTDS 时,一次限制为 1000 行。(如果我能以任何方式修复它,建议我。我想在一个 SQL 中一次 35k 行)
我尝试的第二种方法是使用ActiveRecord Import
我遇到问题的 gem。所以我的数据在循环中,在第一批插入后它给了我一个错误,比如
ArgumentError: struct size differs
红宝石脚本:
def create_coupons
campaign = [483, 482]
start_at = Time.now
puts start_at
column = [:coupon_campaign_id, :coupon_unique_code]
batchData = []
campaign.each_with_index do |camp_id, index|
puts "-----------------------------#{index + 1}/80-----------------------------------------"
70000.times do
coupon_code = ([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(12).join
batchData << [camp_id, coupon_code]
end
FctCoupon.import column, batchData
end
puts "start_at: #{start_at}"
puts "end_at: #{Time.now}"
end
所以这里的问题是它为第一个循环插入了所有 70k 行,但是当我的广告系列 ID 发生第二个循环时,它只会给我一个错误说ArgumentError: struct size differs
FctCoupon.import column, batchData, batch_size: 35000
如果我在插入 35k 行后提到一个 batch_size ,它会给出相同的错误