控制大容量导入的锁定行为

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。有关并行大容量加载的详细信息,请参阅优化大容量导入指南