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表示速度没有改善.
这不是公式,但它是您使用的另一个数据点.
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秒可能有助于提高性能.
这一切都取决于您的实施。
您对网络的期望速度是多少?您是在 Forms 还是 ASP.Net 中使用它?你需要提醒用户进度吗?整个工作的规模是多少?
根据我的经验,在没有指定批量大小的情况下运行批量复制会导致超时问题。我喜欢从 1000 条记录开始,然后从那里做一些调整。
| 归档时间: |
|
| 查看次数: |
48129 次 |
| 最近记录: |