SqlBulkCopy的build议批量大小是多less?
SqlBulkCopy
的build议批量大小是多less? 我正在寻找一个可以用作性能调整起点的通用公式。
我有一个导入实用程序与我的SQL Server实例坐在同一台物理服务器上。 使用自定义IDataReader
,它parsing平面文件并使用SQLBulkCopy
将它们插入到数据库中。 一个典型的文件有大约6M限定行,平均5列十进制和短文本,每行大约30字节。
鉴于这种情况下,我发现5000的批量大小是速度和内存消耗的最佳折衷。 我从500开始,尝试更大。 我发现5000的平均速度是2.5倍,平均为500倍。插入600万行大约需要30秒,批量为5000,批量为500时,大约需要80秒。
10,000没有明显加快。 移动速度提高了5万点,速度提高了几个百分点,但不值得在服务器上增加负载。 5万以上的速度没有提高。
这不是一个公式,但它是另一个数据点供您使用。
这个问题我也花了一些时间来研究。 我正在寻找优化使用C#控制台应用程序(.Net 2.0)导入大型CSV文件(16 + GB,65 +百万条logging,并不断增长)到SQL Server 2005数据库。 正如Jeremy 已经指出的那样 ,您需要针对您的具体情况进行一些微调,但是我build议您将初始批量大小设置为500,并且testing值均高于和低于此值。
我得到了build议,testing从这个MSDN论坛post批量大小在100和1000之间的值,并持怀疑态度。 但是,当我testing批量大小在100到10,000之间时,我发现500是我的应用程序的最佳值。 SqlBulkCopy.BatchSize
的500值也在这里推荐。
要进一步优化您的SqlBulkCopy操作,请查看此MSDNbuild议 ; 我发现使用SqlBulkCopyOptions.TableLock有助于减less加载时间。
正如其他人所说,这取决于你的环境,特别是行容量和networking延迟。
就个人而言,我会开始将BatchSize
属性设置为1000行,看看如何执行。 如果它有效,那么我保持加倍的行数(例如到2000,4000等),直到我超时。
否则,如果在1000时发生超时,那么我将行数减半(例如500)直到它工作。
在每一种情况下,我保持加倍(如果成功)或减半(如果失败)最后两个尝试的批量大小之间的差异 ,直到find一个最佳点。
另一个需要考虑的因素是复制单个批次的行需要多长时间。 如果正在复制的行批量超过BulkCopyTimeout
属性(默认为30秒),则会发生超时。 您可以尝试将BulkCopyTimeout
属性翻倍为60秒。 这允许更长的时间段来复制更大批量的行。 例如,一批50,000行可能需要大约40秒,只是超过了30秒的时间限制,所以将其冲击到60秒可能有助于性能。
这一切都取决于你的实施。
你可以期望在你的networking上有什么样的速度? 你在Forms或ASP.Net中使用它吗? 你需要提醒用户的进展? 总工作的规模是多less?
根据我的经验,在没有指定批处理大小的情况下运行批量复制将导致超时问 我喜欢从1000条logging开始,并从那里做一些调整。