Sql server 实现每秒30000次SQL插入的最佳方法

Sql server 实现每秒30000次SQL插入的最佳方法,sql-server,multithreading,Sql Server,Multithreading,不使用SSI或批量插入、批量加载或批量任何内容;我需要能够调用一个插入数据的存储过程 我有一个2.8Gig的文件,包含超过1800万条记录。 我的解决方案是用C#编写的,利用并行处理和异步等待,在多台服务器上使用多线程进程在10分钟内解析该文件。然而,无论我尝试什么,附加线程、附加服务器,甚至通过传递表值参数在一次调用中插入多条记录,我能将这些记录插入SQL数据库的最快速度是每秒3100条。存储过程只包含INSERT语句,而表没有索引或键。以这种速度,将解析结果存储到数据库需要100分钟。我需要

不使用SSI或批量插入、批量加载或批量任何内容;我需要能够调用一个插入数据的存储过程

我有一个2.8Gig的文件,包含超过1800万条记录。 我的解决方案是用C#编写的,利用并行处理和异步等待,在多台服务器上使用多线程进程在10分钟内解析该文件。然而,无论我尝试什么,附加线程、附加服务器,甚至通过传递表值参数在一次调用中插入多条记录,我能将这些记录插入SQL数据库的最快速度是每秒3100条。存储过程只包含INSERT语句,而表没有索引或键。以这种速度,将解析结果存储到数据库需要100分钟。我需要将时间缩短到10分钟,这意味着我必须将插入记录的能力提高十倍。数据库是我唯一的瓶颈

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

while ....
    insert into table1(...)
    select * from whatever 
    where YEAR(timestamp) = year
end
A) 使用多个文件组就可以了吗

B) 将表格拆分为不同的版本,例如: EtlRecords001,EtlRecords002,EtlRecords003,…,EtlRecords100。 这里的想法是把桌子变小

C) 最后,通过使用多个SQL Server来扩展工作 这里的想法也是使用较小的表,并结合使用多个数据库服务器

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

由于不太了解文件组,我不得不相信有比案例B和案例C更好的方法


最后,对我来说,购买一台48核、128千兆内存的服务器不是一个可行的选择:)

你能试着将数据分批处理吗?因为您无法测量计算资源瓶颈。我最好的猜测是你的记忆是瓶颈

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,以获得适合每次调用数据大小的新计划。

上载时,CPU、硬盘或内存是否达到峰值?Rawitas,我没有远程登录数据库服务器的权限,因此无法回答此问题。在任何情况下,该服务器都有30多个其他数据库,我不知道企业中的其他应用程序如何使用这些数据库。占用资源真的不是一个选项,所以我需要能够在不增加cpu、硬盘或内存的情况下解决这个问题。但是,在其他服务器上添加表、文件组,甚至创建新数据库都是我有权限的事情;我看到峰值超过60。实际上我已经将数据分为批,这就是我如何在10分钟内解析一个2.8Gig文件的方法。换句话说,当我注释掉我的数据层代码时,我在各种机器上的跟踪日志显示成功解析了1800万条记录,整个过程在10分钟内完成。当我取消对数据层调用的注释时,跟踪代码会显示瓶颈。所有1800万条记录都已成功插入数据库,但这一次整个过程耗时一小时四十二分钟。您是否能够以某种方式获得查询计划?你能试着在重新编译的情况下运行sp吗?这是一个简单的insert语句,插入到一个有7列的表中。没有视图,没有主键,没有约束,没有索引,没有默认值,我没有使用提示,没有CTE,也没有逻辑语句,只有一个基本insert语句。执行计划与资源分配有关,因此有时运行sp时有重新编译帮助。正在阅读关于使用重新编译的内容;我会尝试一下,并报告我得到的性能提升(如果有的话)。谢谢