2

我在并行线程中使用 SqlBulkCopy 将数据插入表中。互联网上的各种链接说 TableLock 是使用 SqlBulkCopy 的好选择。

数据庞大且连续。

RowLock 在多线程中提供更好的性能吗?如果启用表锁,我对一个线程完成插入所花费的时间会导致等待其他线程等待而行锁定不应该对插入产生任何影响感到困惑。

4

1 回答 1

1

您应该使用表锁;SqlBulkCopy 有它自己的表锁,它对多个大容量复制插入操作是并发的(大容量更新 (BU) 锁)。在您使网络 I/O 饱和之前,并行线程将有所帮助。一个经验法则(根据我的个人测试)是使用n 个消费者,其中n是服务器内核数的2 倍。自己做实验。您绝对不想要行锁,因为这会破坏批量操作提供的许多优化。

提高性能的最佳选择是:

  1. 尽可能保持批量大小 - 您可能需要增加操作的超时时间以防止长时间运行失败(将超时设置为零以无限制)。要一次性完成整个集合,请将批量大小设置为零。如果您有一个非常大的数据集,请查看直接从源流式传输到批量复制。

  2. 删除目标表上的任何索引,然后在完成加载后进行碎片整理并创建索引。结合表锁,这应该可以最大限度地减少日志开销并提高性能。您也不能对具有聚集索引的表使用 TABLOCK 和并发操作。

于 2018-07-17T21:29:46.720 回答