不使用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核心服务器对我来说不是一个可行的选择:)
答案 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以获得适合每次调用数据大小的新计划。