控制大量匯入的鎖定行為
bcp 命令、BULK INSERT 陳述式和 INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式可讓您指定在大量匯入作業期間鎖定資料表。鎖定是 SQL Server Database Engine 所使用的機制,用以同步處理多個使用者同時存取的相同資料。當交易修改資料時,它會持有防止修改的鎖定,直到交易結束為止。當您針對大量匯入作業指定資料表鎖定時,大量匯入作業期間會針對資料表採用大量更新 (BU) 鎖定。BU 鎖定可讓多個執行緒將資料同時大量匯入到相同資料表,同時防止未大量匯入資料的其他處理序存取該資料表。資料表鎖定會減少資料表上的鎖定爭用情況,因而提升大量匯入作業的效能。
如果不使用資料表鎖定,則預設會使用資料列層級的鎖定,除非 table lock on bulk load 選項設定為 on。使用 sp_tableoption 設定 table lock on bulk load 選項,可設定在大量匯入作業期間資料表的鎖定行為。
大量匯入時的資料表鎖定 |
資料表鎖定行為 |
---|---|
Off |
使用的資料列層級鎖定 |
On |
使用的資料表層級鎖定 |
如果指定資料表鎖定,則大量匯入作業期間會覆寫以 sp_tableoption 設定的資料表預設值。
[!附註]
從多個用戶端以平行方式大量匯入資料到資料表時,並非一定要使用資料表鎖定,但這樣做可以提升效能。
命令限定詞
下表彙總了在大量匯入命令中用來指定資料表鎖定的限定詞。
命令 |
限定詞 |
限定詞類型 |
---|---|---|
bcp |
-h"TABLOCK" |
提示 |
BULK INSERT |
TABLOCK |
引數 |
INSERT ...SELECT * FROM OPENROWSET(BULK...) |
WITH(TABLOCK) |
資料表提示 |
[!附註]
在 SQL Server 2005 及之後的版本中,在具有叢集索引的資料表上指定 TABLOCK 可防止以平行方式大量匯入資料。在此狀況下,如果想要執行平行大量匯入,請不要使用 TABLOCK。如需有關以平行方式大量載入的詳細資訊,請參閱<最佳化大量匯入的指導方針>。