批量批量大小影响插入

时间:2015-02-02 10:37:29

标签: c# sql-server database datatable sqlbulkcopy

我使用SqlBulkCopy将一百万条记录datatable的内容(每条记录大约有10列)插入数据库表中。 当我更改批量大小属性(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分钟内完成。 然后我将批量大小设置为100,000,时间大约是5:30 然后我把它设置为50,000,时间增加到10分钟。

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

1 个答案:

答案 0 :(得分:4)

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

SQLBulkCopyPerformance

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

  

我们没有在Books OnLine中找到任何内容,也没有在我们的经验中看到任何有趣的内容,这使我们说最好的方法是将BatchSize保留为零,这是默认值,因为任何与此不同的值都会降低加载过程的性能

这似乎与您的测试一致。

编辑:

每当我在过去使用过SqlBulkCopy时,我倾向于通过多次插入来控制批量大小,然后只是通过NotifyAfter属性和SqlRowsCopied事件来获取进度更新随着副本的进展。