SqlBulkCopy
的建议批量大小是多少?我正在寻找一个可用作性能调优起点的通用公式。
答案 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数据库。由于Jeremy有already 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很好