一括インポートのロック動作の制御
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 を使用しないでください。並行一括読み込みの詳細については、「一括インポートを最適化するためのガイドライン」を参照してください。 |