在SQL中每秒实现30,000次插入的最佳方法

时间:2017-12-13 04:33:52

标签: sql-server multithreading

不使用SSIS或批量插入,批量加载或批量处理;我需要能够调用插入数据的存储过程。

我有一个包含超过1800万条记录的2.8 gig文件。 我的解决方案是用C#编写的,利用并行处理和ASYNC-AWAIT,在多个服务器上使用多线程进程在10分钟内解析该文件。但是,无论我尝试什么,额外的线程,额外的服务器,甚至通过传递一个表值参数在一个调用中插入多个记录,我可以将这些记录插入SQL数据库的最快速度是每秒3100。存储过程仅包含INSERT语句,并且该表没有索引或键。按此速率,将解析后的结果存储到数据库中需要100分钟。我需要将其降低到10分钟,这意味着我必须增加将记录插入十倍的能力。数据库是我唯一的瓶颈。

A)使用多个文件组会不会这样做?

B)如何将表格分成版本,例如: EtlRecords001,EtlRecords002,EtlRecords003,...,EtlRecords100。 这里的想法是缩小表格。

C)最后,使用多个SQL服务器传播工作 这里的想法也是使用较小的表并结合使用多个数据库服务器。

在B和C的情况下,解决方案显然会使不同机器上的进程目标不同; B.)表格版本; C)服务器实例。

对文件组不太了解,我不得不相信有比B和C更好的方法。

最后,购买一台配备128 gig ram的48核心服务器对我来说不是一个可行的选择:)

1 个答案:

答案 0 :(得分:0)

您可以尝试将数据分成批次吗?由于您无法衡量计算资源瓶颈。我最好的猜测是你的记忆是瓶颈。

create cursor ....
select YEAR(timestamp)-- or anything else

while ....
    insert into table1(...)
    select * from whatever 
    where YEAR(timestamp) = year
end

第二点exec dbo.insert1 with recompile您可能希望重新编译sp以获得适合每次调用数据大小的新计划。