首页 > 解决方案 > TABLOCK 是否会提高 BULK INSERT 的性能?

问题描述

我只是想知道 TABLOCK 是否会提高 BULK INSERT 的性能?

根据https://dba.stackexchange.com/questions/165966/how-does-one-investigate-the-performance-of-a-bulk-insert-statement中的第一个答案,TABLOCK 似乎会。

根据https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-ver15的官方文档,它说“一张表可以如果表没有索引并且指定了 TABLOCK,则由多个客户端同时加载。" 但就我而言,只有一个会话需要将数据批量插入数据库,所以我似乎根本不需要指定 TABLOCK。

我在https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a957cd37-ec96-4beb-8a4b-03d783c7f91e/whether-tablock-will-improve-the-performance-of-上问过这个问题bulk-insert-or-not?forum=transactsql但没有得到满意的答案,所以我不得不在这里重新发布问题。

谢谢

标签: sql-servertsqlbulkinsert

解决方案


TABLOCK 指定在大容量导入操作期间获取表级锁。如果表没有索引并且指定了 TABLOCK,则可以由多个客户端同时加载表。默认情况下,锁定行为由表选项 table lock on bulk load 确定。在大容量导入操作期间持有锁可减少表上的锁争用,在某些情况下可以显着提高性能。

如果您的数据插入到表中只有一个会话表锁对您没有任何好处,但是当许多会话可以将数据插入到您的表中时,表锁可以减少您进程中的锁争用。但是当您的表有表锁定时,另一个会话无法访问表。


推荐阅读