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

时间:2009-04-22 23:38:40

标签: .net sql-server performance ado.net

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

5 个答案:

答案 0 :(得分:87)

我有一个导入实用程序与我的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表示速度没有改善。

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

答案 1 :(得分:26)

这是一个我也花了一些时间研究的问题。我希望使用C#控制台应用程序(.Net 2.0)优化将大型CSV文件(16 + GB,6500万条记录和增长)导入SQL Server 2005数据库。由于Jeremyalready pointed out,您需要针对您的具体情况进行一些微调,但我建议您的初始批量大小为500,测试值均高于此值。

我建议从此MSDN forum post测试批量大小在100到1000之间的值,并持怀疑态度。但是当我测试100到10,000之间的批量大小时,我发现500是我的应用程序的最佳值。还建议使用SqlBulkCopy.BatchSize的500值here

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

答案 2 :(得分:13)

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

就个人而言,我首先将BatchSize属性设置为1000行并查看其执行情况。如果它有效,那么我会将行数加倍(例如到2000,4000等)直到我超时。

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

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

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

答案 3 :(得分:3)

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

您可以在网络上获得什么样的速度? 你在Forms或ASP.Net中使用它吗? 您需要提醒用户进度吗? 总工作的规模是多少?

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

答案 4 :(得分:-1)

我尝试了多种尺寸,在我看来5000很好