我使用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速度的影响。一般来说,它会使事情变得更快或更慢吗?
答案 0 :(得分:4)
看看这篇广泛测试批量大小的白皮书:
关于使用不同批量大小的网络利用率等,有很多数据,但结论如下:
我们没有在Books OnLine中找到任何内容,也没有在我们的经验中看到任何有趣的内容,这使我们说最好的方法是将BatchSize保留为零,这是默认值,因为任何与此不同的值都会降低加载过程的性能
这似乎与您的测试一致。
编辑:
每当我在过去使用过SqlBulkCopy时,我倾向于通过多次插入来控制批量大小,然后只是通过NotifyAfter属性和SqlRowsCopied事件来获取进度更新随着副本的进展。