一括インポートのロック動作の制御

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 オプションを設定すると、一括インポート操作時のテーブルのロック動作が設定されます。

一括インポート時のテーブル ロック

テーブル ロック動作

Off

行レベル ロックが使用されます。

On

テーブルレベル ロックが使用されます。

テーブル ロックを指定した場合、一括インポート操作の実行中に、sp_tableoption で設定されたテーブルの既定の設定が上書きされます。

注意注意

複数のクライアントからテーブルにデータを並行して一括インポートするためにテーブル ロックを使用する必要はありませんが、テーブル ロックを使用するとパフォーマンスを向上させることができます。

コマンド修飾子

次の表は、一括インポート コマンドでテーブル ロックを指定するための修飾子をまとめたものです。

コマンド

修飾子

修飾子の種類

bcp

-h"TABLOCK"

ヒント

BULK INSERT

TABLOCK

引数

INSERT ...SELECT * FROM OPENROWSET(BULK...)

WITH(TABLOCK)

テーブル ヒント

注意注意

SQL Server 2005 以降のバージョンでは、クラスタ化インデックス付きテーブルで TABLOCK を指定すると、データの並行一括インポートができなくなります。このようなケースで並行一括インポートを実行したい場合は、TABLOCK を使用しないでください。並行一括読み込みの詳細については、「一括インポートを最適化するためのガイドライン」を参照してください。