控制大容量导入的锁定行为
bcp 命令、BULK INSERT 语句和 INSERT ... SELECT * FROM OPENROWSET(BULK...)语句可以指定在大容量导入操作期间锁定表。锁定是 SQL Server 数据库引擎用来对多个用户同时访问同一数据块的操作进行同步。当事务修改某个数据块时,它将持有保护所做修改的锁,直到事务结束。指定大容量导入操作的表锁定后,该表将在大容量导入操作期间采取大容量更新 (BU) 锁定。大容量更新 (BU) 锁允许多个线程将数据并发地大容量导入到同一表中,同时阻止其他不进行大容量导入数据的进程访问该表。表锁定可以通过减少表的锁争用来提高大容量导入操作的性能。
如果未使用表锁定,默认使用行级锁定,除非 table lock on bulk load 选项的设置为 on。使用 sp_tableoption 设置 table lock on bulk load 选项可以设置大容量导入操作过程中针对表的锁定行为。
table lock on bulk import |
表锁定行为 |
---|---|
Off |
使用行级锁定 |
On |
使用表级锁定 |
如果指定了表锁定,则使用 sp_tableoption 为该表设置的默认设置将在大容量导入操作过程中被替代。
注意 |
---|
以并行方式从多个客户端大容量导入数据到表中时,不必使用表锁定,但这样做可以提高性能。 |
命令限定符
下表概述了用于在大容量导入命令中指定表锁定的限定符。
命令 |
限定符 |
限定符类型 |
---|---|---|
bcp |
-h"TABLOCK" |
提示 |
BULK INSERT |
TABLOCK |
参数 |
INSERT ...SELECT * FROM OPENROWSET(BULK...) |
WITH(TABLOCK) |
表提示 |
注意 |
---|
在 SQL Server 2005 及更高版本中,对带有聚集索引的表指定 TABLOCK 可以防止并行大容量导入数据。如果您想在这种情况下执行并行大容量导入,则不要使用 TABLOCK。有关并行大容量加载的详细信息,请参阅优化大容量导入指南。 |