sql-server - 实现每秒 30,000 次插入 SQL 的最佳方法

标签 sql-server multithreading

不使用 SSIS 或大容量插入、大容量加载或大容量任何东西;我需要能够调用插入数据的存储过程。

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

A) 使用多个文件组是否有效?

B) 将表格分成多个版本怎么样,例如: EtlRecords001,EtlRecords002,EtlRecords003,...,EtlRecords100。 这里的想法是让表格变小。

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

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

我对文件组知之甚少,我不得不相信有比情况 B 和 C 更好的方法。

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

最佳答案

你能试着把数据分成批处理吗?由于您无法衡量计算资源瓶颈。我最好的猜测是你的内存是瓶颈。

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

关于sql-server - 实现每秒 30,000 次插入 SQL 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785533/

相关文章:

sql-server - 插入语句在 SQL Server 2005 上失败,但在 2008 R2 或更高版本上运行良好

sql-server - sql server 如何将 nvarhcar 列默认为 GUID(如果它为 null 或空)

java - 两个线程如何同时访问同步块(synchronized block)

android - 蓝牙:程序卡在 connect() 方法

c++ - 如何在 Qt 中的另一个线程中发出插槽信号

c - 如何在多线程服务器客户端程序中处理数据包?

sql - 加入查询结果

MySQL 更新到 SQL Server 语法错误

unix - POSIX 线程 : are pthreads_cond_wait() and others systemcalls?

SQL CASE LIKE 具有多种选择