从.NET代码插入SQL Server表的最快方法?

11 sqlbulkcopy sql-server-2008

最快的方法是:

  • 一个表,没有我无法预填的参考(即那里有一个参考密钥,但我填写了所有数据)
  • 很多数据.我们每天谈论数亿行,通过API动态进行
  • 必须/应该在近乎实时的情况下尽快处理请求(即没有写入文件以便每天上传一个).2秒是正常的最大延迟
  • 用于数据/应用程序和SQL Server的独立机器

我现在应该做什么:

  • 将最多32*1024行聚合到一个数组中,然后对其进行排队.
  • 用2-3个线程读取队列.使用SqlBulkCopy插入数据库.

我每秒输入大约60k-75k行,这还不够,但非常接近.我想要达到250.000行.

到目前为止还没有真正使用过.我得到20%的时间"网络I/O"块,有一个核心80%加载CPU端.光盘写出7mb-14mb,大部分是空闲的.RAID 10上的6个raptors的平均队列长度是...... 0.25.

任何人都知道如何加快速度?更快的服务器(到目前为止它是虚拟的,8GB RAM,4个核心,物理磁盘通过数据).


添加一些说明:

  • 这是2008 R2服务器上的2008 R2 Enterprise SQL Server.机器有4个核心,8gb内存.全64位.平均80%的负载来自这台机器,显示大约20%的CPU负载.
  • 该表很简单,没有主键,只有关系引用(工具引用)上的索引和唯一(在一组工具中,因此不强制执行)时间戳.
  • 上表中的字段包括:时间戳,仪器参照(无强制外键),数据类型(字符1,一个数字,指示帐什么数据字符中的一个),价格(双)和体积(INT).正如您所看到的,这是一张非常薄的桌子.有问题的数据是金融工具的刻度数据.
  • 问题还在于硬件等 - 主要是因为我没有看到真正的瓶颈.我插入多个交易,它给了我一个好处,但一个小的.光盘,CPU没有显示显著负载,网络IO等待高(300毫秒/秒,此刻的30%),但这是它运行仅仅指刚两台服务器,并具有足够的核心来运行所有相同的虚拟化平台上.我几乎愿意"购买另一台服务器",但我想首先确定瓶颈....特别是考虑到在一天结束时我并没有抓住瓶颈是什么.日志记录无关紧要 - 批量插入不会作为数据(没有聚集索引)进入数据日志.

垂直分区是否有助于,例如通过一个字节(tinyint)将仪器世界分开,例如16个表格,因此我最多同时进行16次插入?实际上,数据来自不同的交易所,我可以为每个交易所制作一个分区.这将是一个自然的分裂场(实际上是在乐器中,但我可以在这里复制这些数据).


更多澄清:速度更高(90k),现在明显受到机器之间的网络IO的限制,这可能是VM切换.

我现在要做的就是做每32K行的连接,搭起一个临时表,插入此与SqlBUlkdCopy,然后用一条SQL语句复制到主表 - 在主表最大限度地减少任何锁定时间.

大多数等待时间现在仍在网络IO上.似乎我遇到了VM明智的问题.将在未来几个月转移到物理硬件;)

Bra*_*vax 0

您可以使用水平分区吗?请参阅:http ://msdn.microsoft.com/en-us/library/ms178148.aspx和http://msdn.microsoft.com/en-us/library/ms188706.aspx

您可能还想看看这个问题,并可能更改恢复模型: Sql Server 2008 Tuning with large transactions (700k+ rows/transaction)

一些问题:您使用的是哪个版本的 SQL Server?

为什么单核是80%?这可能是瓶颈,因此可能值得研究。

您使用什么操作系统,是 64 位吗?