SqlBulkCopy的推荐批量大小是多少?

Jon*_*len 81 .net sql-server performance ado.net

推荐的批量大小是SqlBulkCopy多少?我正在寻找一个可用作性能调优起点的通用公式.

Alr*_*ric 92

我有一个导入实用程序与我的SQL Server实例位于同一物理服务器上.使用自定义IDataReader,它解析平面文件并使用它们将它们插入到数据库中SQLBulkCopy.典型文件具有大约6M限定行,平均5列十进制和短文本,每行约30个字节.

鉴于这种情况,我发现批量大小为5,000是速度和内存消耗的最佳折衷方案.我从500开始,并尝试更大.我发现5000平均速度比500快2.5倍.插入600万行需要大约30秒,批量大小为5,000,大约80秒,批量大小为500.

10,000没有明显更快.移动到50,000可以将速度提高几个百分点,但不值得增加服务器负载.超过50,000表示速度没有改善.

这不是公式,但它是您使用的另一个数据点.

  • 要考虑的一件事是表是否为空且具有索引.在这些情况下,您可能希望一次性上传所有内容,如下所述:https://technet.microsoft.com/en-us/library/ms177445(v = sql.105).aspx"如果批量导入数据到带有索引的空表并指定批量大小,第一批后表变为非空.从第二批开始,数据完全记录.对于空索引表,请考虑在单个批处理中执行批量导入. " (3认同)

Mag*_*ndi 28

这是一个我也花了一些时间研究的问题.我希望使用C#控制台应用程序(.Net 2.0)优化将大型CSV文件(16 + GB,6500万条记录和增长)导入SQL Server 2005数据库.正如杰里米已经指出的那样,你需要做一些微调您的具体情况,但我会建议你有500的初始批量大小和测试值都高于或低于这个.

我建议在这个MSDN论坛帖子中测试批量大小在100到1000之间的值,并且持怀疑态度.但是当我测试100到10,000之间的批量大小时,我发现500是我的应用程序的最佳值.此处SqlBulkCopy.BatchSize还建议使用500的值.

要进一步优化SqlBulkCopy操作,请查看此MSDN建议 ; 我发现使用SqlBulkCopyOptions.TableLock有助于减少加载时间.


Ray*_*ega 15

正如其他人所说,这取决于您的环境,特别是行数和网络延迟.

就个人而言,我首先将BatchSize属性设置为1000行,看看它是如何执行的.如果它工作,那么我继续加倍行数(例如到2000,4000等),直到我得到超时.

否则,如果超时发生在1000,那么我将行数减少一半(例如500)直到它工作.

在每种情况下,我保持加倍(如果成功)或减半(如果失败)最后两个尝试批量大小中的每一个之间的差异,直到找到最佳位置.

另外要考虑的因素是如何长时间才能复制单个一批行.如果要复制的批处理行超过BulkCopyTimeout默认值为30秒的属性,则会发生超时.您可以尝试将该BulkCopyTimeout属性加倍至60秒.这允许更长的时间段来复制更大的批量行.例如,一批50,000行可能需要大约40秒才超过30秒的时间限制,因此将其提高到60秒可能有助于提高性能.


Jer*_*emy 5

这一切都取决于您的实施。

您对网络的期望速度是多少?您是在 Forms 还是 ASP.Net 中使用它?你需要提醒用户进度吗?整个工作的规模是多少?

根据我的经验,在没有指定批量大小的情况下运行批量复制会导致超时问题。我喜欢从 1000 条记录开始,然后从那里做一些调整。