如何最快地完成以下操作:
- 一个表,没有我不能预先填充的引用(即有一个引用键,但我已经填好所有数据)
- 大量数据。我们谈论每天来自API的数亿行数据流动
- 请求必须/应该在接近实时的情况下尽快处理(即不要写出到文件以供每天上传)。2秒是正常的最大延迟
- 为数据/应用程序和SQL Server分别使用不同的机器
目前我的做法:
- 聚合至32 * 1024行到数组中,然后将其排队。
- 在2-3个线程中读取队列。使用SqlBulkCopy插入数据库。
我每秒导入约60k-75k行,这还不够,但非常接近。 我希望达到250,000行。
到目前为止,什么都没有真正用上。我得到20%的"网络I/O"阻塞时间,其中一个核心80%的CPU负载。磁盘正在写入7mb-14mb,大部分处于空闲状态。由6个Raptors组成的RAID 10的平均队列长度为.... 0.25。
有人有任何想法如何加快速度吗?更快的服务器(目前是虚拟的,8GB RAM,4核心,数据物理盘通过)。
添加一些澄清:
- 这是一个2008 R2 Enterprise SQL Server,运行于2008 R2服务器上。 机器有4个核心,8GB RAM。全部是64位的。80%的负载平均值来自于此机器显示约20%的CPU负载。
- 表是简单的,没有主键,只有一个关系参考上的索引(仪器参考),以及一个唯一的时间戳(在一组仪器内是唯一的,因此不受强制执行)。
竖直分区是否有帮助,例如通过一个字节(tinyint)将工具宇宙划分为16张表格,我因此同时进行多达16次插入?实际上,数据来自不同的交易所,因此我可以根据交易所进行分区。这将是自然的分裂领域(实际上在工具中,但我可以在此处复制此数据)。
更多澄清:速度提高了(90k),现在明显受到机器之间的网络IO的限制,这可能是VM切换造成的。
我现在所做的是每32k行进行一次连接,设置一个临时表,在此表格中使用SqlBUlkdCopy进行插入,然后使用一个sql语句将其复制到主表格中-最小化主表格上的任何锁定时间。
大部分等待时间仍在网络IO上。似乎我遇到了VM问题。未来几个月将转向物理硬件;)