Share via


控制大量匯入的鎖定行為

bcp 命令、BULK INSERT 陳述式和 INSERT ...SELECT * FROM OPENROWSET(BULK...) 陳述式可讓您指定在大量匯入作業期間鎖定資料表。鎖定是 SQL ServerDatabase 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。如需有關以平行方式大量載入的詳細資訊,請參閱<最佳化大量匯入的指導方針>。