我在并行线程中使用 SqlBulkCopy 将数据插入到表中。 Internet 上的各种链接都说 TableLock 是使用 SqlBulkCopy 的不错选择。
数据庞大且连续。
RowLock 是否在多线程中提供更好的性能?我很困惑,如果启用了表锁,一个线程完成插入所花费的时间将导致等待其他线程等待,而行锁定不应该对插入产生任何影响。
请您参考如下方法:
你应该使用表锁; SqlBulkCopy 有它自己的表锁,该锁对于多个批量复制插入操作是并发的(批量更新 (BU) 锁)。并行线程会有所帮助,直到您使网络 I/O 饱和。一条经验法则(来 self 的个人测试)是使用 n 个消费者,其中 n 是服务器核心数的2x。自己做实验。您绝对不需要行锁,因为它会破坏批量操作提供的许多优化。
提高性能的最佳选择是:
保持批量大小尽可能大 - 您可能需要增加 操作超时以防止长时间运行失败(设置 超时为零表示没有限制)。要一次完成整个集合,请将批量大小设置为零。如果您有一个非常大的数据集,请考虑直接从源流式传输到批量复制。
删除目标表上的所有索引,然后进行碎片整理并创建 完成加载后的索引。结合表锁这个 应该最小化日志开销并提高性能。您也不能在具有聚集索引的表上使用 TABLOCK 和并发操作。
