不使用SSIS、批量插入、批量加载或任何批量操作;我需要能够调用存储过程来插入数据。
我有一个包含超过1800万条记录的2.8 GB文件。我的解决方案采用C#编写,并利用并行处理和ASYNC-AWAIT,在多个服务器上使用多线程进程来解析这个文件,只需10分钟。然而,无论我尝试什么,增加线程、增加服务器,甚至传递一个表值参数以在一次调用中插入多个记录,我能将这些记录最快地插入SQL数据库的速度是每秒3100条。存储过程只包含INSERT语句,表没有索引或键。以这种速度,将解析结果存储到数据库中需要100分钟。我需要将此时间缩短到10分钟,这意味着我必须将插入记录的能力提高十倍。数据库是我的唯一瓶颈。
A)使用多个文件组有用吗?
B)将表分成不同版本,例如:EtlRecords001,EtlRecords002,EtlRecords003,...,EtlRecords100。这里的想法是使表更小。
C)最后,通过使用多个SQL服务器扩展工作。这里的想法也是使用较小的表,结合使用几个数据库服务器。
对于B和C的情况,显然解决方案需要在不同的机器上针对不同的B)表版本;C)服务器实例。
由于我对文件组知之甚少,因此我相信有比案例B和C更好的方法。
最后,购买一个具有128 GB RAM和48个核心的服务器对我来说不是可行的选择 :)
我有一个包含超过1800万条记录的2.8 GB文件。我的解决方案采用C#编写,并利用并行处理和ASYNC-AWAIT,在多个服务器上使用多线程进程来解析这个文件,只需10分钟。然而,无论我尝试什么,增加线程、增加服务器,甚至传递一个表值参数以在一次调用中插入多个记录,我能将这些记录最快地插入SQL数据库的速度是每秒3100条。存储过程只包含INSERT语句,表没有索引或键。以这种速度,将解析结果存储到数据库中需要100分钟。我需要将此时间缩短到10分钟,这意味着我必须将插入记录的能力提高十倍。数据库是我的唯一瓶颈。
A)使用多个文件组有用吗?
B)将表分成不同版本,例如:EtlRecords001,EtlRecords002,EtlRecords003,...,EtlRecords100。这里的想法是使表更小。
C)最后,通过使用多个SQL服务器扩展工作。这里的想法也是使用较小的表,结合使用几个数据库服务器。
对于B和C的情况,显然解决方案需要在不同的机器上针对不同的B)表版本;C)服务器实例。
由于我对文件组知之甚少,因此我相信有比案例B和C更好的方法。
最后,购买一个具有128 GB RAM和48个核心的服务器对我来说不是可行的选择 :)