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

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只猛禽的平均队列长度是...... 0.25。

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


添加一些说明:

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

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


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

我现在做的是每32k行进行一次连接,建立临时表,使用SqlBUlkdCopy插入,然后使用ONE sql语句复制到主表 - 最小化主表上的任何锁定时间。

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

热门答案

如果你每秒管理70k行,那么到目前为止你很幸运。但我怀疑这是因为你有一个非常简单的架构。

我不敢相信你问这种负担

  • 虚拟服务器
  • 单阵列
  • SATA磁盘

网络和CPU是共享的,IO受到限制:您无法使用所有资源。您看到的任何负载统计数据都不是很有用。我怀疑你看到的网络负载是2个虚拟服务器之间的流量,如果你解决了这个问题,你将成为IO绑定

在继续之前,请阅读35K tps的10节课 。他没有使用虚拟盒子。

这是我要做的,如果你想增加数量,假设没有SAN和没有DR功能。

  • 购买2大物理服务器,CPU RAM类无关紧要,最大内存,去x64安装
  • 磁盘+控制器=最快的主轴,最快的SCSI。或者是一个伟大的NAS
  • 1000MB + NIC
  • RAID 10具有6-10磁盘, 用于您的数据库的 一个日志文件
  • 剩余磁盘RAID 5或RAID 10用于数据文件

作为参考,我们的峰值负载是每小时1200万行(16核,16GB,SAN,x64),但我们的负载复杂。我们没有能力。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因