影响插入的bulkcopy批量大小

dis*_*kid 2 c# database sql-server datatable sqlbulkcopy

我正在使用 anSqlBulkCopy将一百万条记录(每条记录大约有 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);
}
Run Code Online (Sandbox Code Playgroud)

当我不使用批量大小时,该过程在 7 分钟内完成。然后我将批量大小设置为100,000,时间在5:30左右,然后我将其设置为50,000,时间增加到10分钟。

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

Gar*_*ght 5

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

SQL批量复制性能

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

我们没有找到在线书籍中提到的任何内容,也没有在我们的经验中看到任何有趣的东西,这导致我们说,对 BatchSize 最好的做法是将其保留为零,这是它的默认值,因为任何值与此不同会降低加载过程的性能

这似乎与你的测试一致。

编辑:

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