影响插入的 bulkcopy 批量大小

bulkcopy batch size affecting the insert

我正在使用 SqlBulkCopy 将一百万条记录(每条记录大约有 10 列)的 datatable 的内容插入数据库 table。 当我更改批量大小 属性 (bulkCopy.BatchSize).

时,我在批量复制期间看到了一些 unstable 值
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 分钟内完成。 然后我将批量大小设置为 100,000,时间大约是 5:30 然后我将它设置为 50,000,时间增加到 10 分钟。

我想知道批量大小对 INSERT 速度的影响。一般来说,它会使事情变快还是变慢?

看看这份广泛测试批量大小的白皮书:

SQLBulkCopyPerformance

里面有很多关于使用不同批量大小的网络利用率等的数据,但结论如下:

We did not find anything mentioned in the Books OnLine nor have we ever seen anything interesting during our experience, this lead us to say that the best thing to do with BatchSize is to leave it to zero, which is its default value, since any value different from that will decrease the performance of the load process

这似乎与您的测试一致。

编辑:

每当我过去使用 SqlBulkCopy 时,我都倾向于通过多次插入来自己控制批处理大小,然后仅通过 NotifyAfter 属性 和 SqlRowsCopied 事件在复制过程中获取进度更新。