最快的方法是什么:
- 一张表,没有我无法预填充的引用(即那里有一个引用键,但我已经填写了所有数据)
- 大量数据。我们每天谈论数亿行,通过 API 动态进入
- 请求必须/应该在近乎实时的情况下尽快处理(即每天不写入文件以上传一个)。2 秒是正常的最大延迟
- 用于数据/应用程序和 SQL Server 的单独机器
我现在应该做什么:
- 将最多 32*1024 行聚合到一个数组中,然后将其排队。
- 在 2-3 个线程中读取队列。使用 SqlBulkCopy 插入数据库。
我每秒导入大约 60k-75k 行,这还不够,但非常接近。我很想达到 250.000 行。
到目前为止,还没有真正使用任何东西。我得到 20% 的时间“网络 I/O”块,有一个核心 80% 负载 CPU 端。光盘正在写入 7mb-14mb,大部分是空闲的。6 只猛禽的 RAID 10 上的平均队列长度为.... 0.25。
有人知道如何加快速度吗?更快的服务器(到目前为止它是虚拟的,8GB 内存,4 核,物理磁盘通过数据)。
添加一些说明:
- 这是 2008 R2 服务器上的 2008 R2 Enterprise SQL Server。机器有4个核心,8GB内存。全部 64 位。80% 的平均负载来自这台机器,显示大约 20% 的 cpu 负载。
- 该表很简单,没有主键,只有关系引用(仪器引用)上的索引和唯一的(在一组仪器中,因此不强制执行)时间戳。
- 表中的字段是:时间戳、工具参考(无强制外键)、数据类型(字符 1,指示发布哪些数据的多个字符之一)、价格(双精度)和交易量(整数)。如您所见,这是一张非常薄的桌子。有问题的数据是金融工具的分时数据。
- 问题还与硬件等有关-主要是因为我看不到真正的瓶颈。我正在插入多个交易,它给了我一个好处,但很小。磁盘、CPU 没有显示出显着的负载,网络 io 等待很高(300 毫秒/秒,目前为 30%),但这是在运行 JSUT 两台服务器的同一虚拟化平台上,并且有足够的内核来运行所有服务器。我几乎愿意“购买另一台服务器”,但我想首先确定瓶颈......特别是考虑到在一天结束时我没有抓住瓶颈是什么。日志记录无关紧要 - 批量插入不会作为数据进入数据日志(无聚集索引)。
垂直分区是否会有所帮助,例如通过一个字节(tinyint)将仪器世界划分为例如 16 个表,因此我可以同时进行多达 16 个插入?由于实际上数据来自不同的交易所,我可以为每个交易所创建一个分区。这将是一个自然的拆分字段(实际上是在仪器中,但我可以在此处复制此数据)。
更多说明:获得了更高的速度(90k),现在显然受到机器之间的网络 IO 的限制,这可能是 VM 切换。
我现在要做的是每 32k 行建立一个连接,建立一个临时表,使用 SqlBUlkdCopy 插入其中,然后使用一个 sql 语句复制到主表 - 最大限度地减少主表上的任何锁定时间。
大多数等待时间现在仍在网络 IO 上。似乎我遇到了 VM 明智的问题。将在接下来的几个月内转向物理硬件;)