我使用SqlBulkCopy将一百万条记录(每条记录大约有10列)的datatable内容插入到数据库表中。
当我更改批大小属性(bulkCopy.BatchSize)时,在大容量复制的持续时间内看到一些不稳定的值。

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.CheckConstraints))
{
    bulkCopy.DestinationTableName = destinationTableName;
    bulkCopy.BatchSize = 100000;
    bulkCopy.BulkCopyTimeout = 1800;
    if (matchingColumns != null || matchingColumns.Count > 0)
    foreach (KeyValuePair<string, string> kv in matchingColumns)
        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(kv.Key, kv.Value));
    bulkCopy.WriteToServer(dt);
}

当我不使用批量时,这个过程在7分钟内完成。
然后我把批量设置为100000,时间大约是5:30
然后我把它设为50000,时间增加到10分钟。
我想知道批量大小对插入速度的影响。总的来说,它是让事情变得更快还是更慢?

最佳答案

请看一下这篇广泛测试批量大小的白皮书:
SQLBulkCopyPerformance
关于不同批量的网络利用率等数据很多,但结论如下:
我们没有在联机丛书中找到任何提到的内容,也没有在我们的体验中看到任何有趣的内容,这使我们不得不说,使用batchsize的最好方法是将其保留为零,这是它的默认值,因为与此不同的任何值都会降低加载过程的性能
这似乎与你的测试一致。
编辑:
每当我过去使用sqlbulkcopy时,我都倾向于通过多次插入来控制批大小,然后只使用notifyafter属性和sqlrowscoped事件来在复制过程中获取进度更新。

关于c# - 批量复制批量大小影响插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28275779/

10-13 00:09