テーブルレベル ロックと並行したデータのインポート

MicrosoftSQL Server を使用すると、複数のクライアントで 1 つのインデックスなしテーブルへの並行データ一括インポートを実行できます。この機能によって、一括インポート操作のパフォーマンスが向上することがあります。データの並行インポートは、bcpBULK INSERT、および INSERT ...SELECT * FROM OPENROWSET(BULK...) の 3 つの一括インポート コマンドによってサポートされています。

注意注意

ODBC ベースまたは SQL OLE DB ベース API を使用しているアプリケーションだけが、単一テーブルへの並行データ読み込みを実行できます。MicrosoftSQL Server 6.5 以前で提供されている DB-Library クライアント ライブラリをベースにした bcp ユーティリティなどのアプリケーションは、SQL Server のインスタンスへの並行データ読み込みに関与できません。

TABLOCK オプション/ヒントを指定しないと、複数の同時実行一括インポート ストリームによってテーブル レベルよりも低い粒度でロックが取得されます。データの分散状況によっては、同時実行一括読み込みストリームが互いにブロックし合うことがあります。したがって、インデックスなしテーブルへの並行データ一括インポートは通常、TABLOCK を指定して実行します。

TABLOCK を使用して SQL Server のインスタンスにデータを並行一括インポートする場合、次の点を検討してください。

  • データを並行インポートするための最も単純なシナリオは、インデックスなしテーブル (ヒープ) へのデータの読み込みです。

  • テーブルにインデックスがない場合は、一括インポート操作に対して TABLOCK オプションを指定します。詳細については、「一括インポートのロック動作の制御」を参照してください。

    注意注意

    テーブルにインデックスが存在する場合は、TABLOCK オプションを使用して並行読み込み操作を実行できません。また、TABLOCK を指定しない場合、同時実行スレッドは互いにブロックします。一括インポート操作の前に、テーブルからインデックスを削除することを検討してください。インデックスを保持するか削除するかの詳細については、「一括インポートを最適化するためのガイドライン」を参照してください。

  • クライアント間でインポートするデータを、クライアントと同じ数のデータ ファイルに分割します。ファイルを 1 つずつ各クライアントに配置します。

    ベスト プラクティス   プロセッサを最も効率よく使用するには、クライアント間で均一にデータを分散します。複数のクライアントから SQL Server のインスタンスにデータを並行インポートする場合は、これらのデータ ファイルがほぼ同じサイズになるようにします。そうしないと、読み込まれている軽負荷のクライアント スレッドが早く終了し、クライアントの CPU を効率よく使用できない場合があります。

  • パフォーマンスを最大限に向上させるには、各クライアントに指定されるバッチ サイズをクライアント データ ファイルのサイズと同じにします。詳細については、「一括インポートのバッチの管理」を参照してください。

テーブルにデータが一括インポートされたら、次の方法で必要なインデックスを作成できます。

  1. 単一クライアントから順番に各クラスタ化インデックスを作成します。詳細については、「クラスタ化インデックスの作成」を参照してください。

  2. 非クラスタ化インデックスを作成します。これらのインデックスは、異なるクライアントから同時に作成できます。詳細については、「非クラスタ化インデックスの作成」を参照してください。

TABLOCK を指定しない場合、ターゲットのインデックスの数にかかわらず、並行データ一括インポートを実行できます。ただしこの場合、一括インポートの最適化はできません。また、個々の行またはページのロックを取得するときにブロックされる場合があります。