我在并行线程中使用SqlBulkCopy将数据插入表中。互联网上的各种链接说TableLock是使用SqlBulkCopy的好选择。
数据巨大且连续。
RowLock在多线程中有更好的表现吗?我感到困惑的是,一个线程完成插入所花费的时间将导致等待其他线程等待,如果启用了表锁定,而行锁定不应对插入产生任何影响。
答案 0 :(得分:0)
您应该使用表锁; SqlBulkCopy具有自己的表锁,该表锁可同时执行多个批量复制插入操作(批量更新(BU)锁)。并行线程将对您有所帮助,直到您使网络I / O达到饱和为止。根据我的个人测试,经验法则是使用 n 个使用者,其中 n 是服务器内核数的 2x 。尝试一下。您绝对不希望使用行锁,因为这会破坏批量操作提供的许多优化。
提高性能的最佳选择是:
保持尽可能大的批次大小-您可能需要增加 操作超时,以防止长期失败(设置 超时为零(无限制)。要一次性完成整个设置,请将批处理大小设置为零。如果您有非常大的数据集,请查看直接从源流到批量复制的流。
将所有索引放在目标表上,然后进行碎片整理并创建 完成加载后索引。结合表锁本 应该最大程度地减少日志开销并提高性能。您也不能在具有聚集索引的表上使用TABLOCK和并发操作。