一括インポートのパフォーマンスの最適化

このトピックでは、bcp コマンド、BULK INSERT ステートメント、または OPENROWSET(BULK...) 関数 (Transact-SQL) を使用して行う Microsoft SQL Server のテーブルへのデータの一括インポートを最適化する方法について説明します。データの一括インポートまたは一括エクスポートをできるだけ高速化するには、パフォーマンスに影響を与える要素と、パフォーマンスの管理に使用できるコマンド修飾子について理解する必要があります。可能な場合は、Transact-SQL ステートメントを使用してデータを SQL Server に一括インポートします。Transact-SQL は bcp よりも高速です。

注意

これらの方法の比較については、「一括インポート操作と一括エクスポート操作について」を参照してください。

特定の一括インポート操作のパフォーマンスの最適化に影響を与える要素は、次のとおりです。

  • テーブルに制約、トリガのいずれかまたは両方が含まれているかどうか。

  • データベースによって使用される復旧モデル。

    詳細については、「復旧モデルの概要」を参照してください。

  • データのコピー先となるテーブルが空かどうか。

  • テーブルにインデックスが含まれているかどうか。

  • TABLOCK が指定されているかどうか。

  • データが 1 つのクライアントからコピーされているか、複数のクライアントから同時にコピーされているか。

  • データが SQL Server を実行している 2 台のコンピュータ間でコピーされるかどうか。

重要な注意事項重要

SQL Server 2005 以降のバージョンでは、トリガが有効になっていると一括インポートの最適化を使用できます。トリガに対して行のバージョン管理が使用され、行のバージョンが tempdb 内のバージョン ストアに格納されます。トリガを使用してデータ レコードの大きなバッチを一括インポートする場合、トリガによってバージョン ストアが受ける影響に対応するために tempdb のサイズを拡張しておく必要性が生じる場合があります。

これらの要素が一括インポートのシナリオに与える影響の詳細については、「一括インポートを最適化するためのガイドライン」を参照してください。

一括インポートを最適化する方法

データの一括インポートを高速化するために、SQL Server には次の方法が用意されています。

  • 最小ログ記録の使用

    単純復旧モデルでは、ほとんどの一括操作について最小限のログが記録されます。

    完全復旧モデルのデータベースの場合、一括インポート中に実行されるすべての行挿入操作が、トランザクション ログに完全に記録されます。大量のデータをインポートすると、トランザクション ログがすぐにいっぱいになる可能性があります。一括インポート操作の場合、最小ログ記録は完全ログ記録よりも効率的で、一括インポート操作によってログ領域がいっぱいになる可能性が少なくなります。通常は完全復旧モデルを使用しているデータベースで一括インポート操作の最小限のログを記録するには、最初にデータベースを一括ログ復旧モデルに切り替えます。データを一括インポートした後で、復旧モデルを完全復旧モデルに戻します。詳細については、「完全復旧モデルまたは一括ログ復旧モデルからの切り替え」を参照してください。

    注意

    最適化された一括ログが適用できる場合には、最小ログ記録で行が挿入されます。それ以外の場合は、完全ログがトランザクション ログに記録されます。一括インポート操作がログに記録されるタイミングと、最小ログ記録で一括インポート操作を実行する方法の詳細については、「最小ログ記録が可能な操作」および「一括インポートで最小ログ記録を行うための前提条件」を参照してください。

  • 複数のクライアントから 1 つのテーブルへのデータの同時インポート

    SQL Server では、複数のクライアントから 1 つのテーブルに同時にデータを一括インポートできます。3 つの一括インポート メカニズムのすべてで、データの同時インポートがサポートされます。これにより、データ インポート操作のパフォーマンスが向上する可能性があります。

    詳細については、「テーブルレベル ロックと並行したデータのインポート」を参照してください。

  • バッチの使用

    データのインポートにバッチを使用する方法と、バッチを管理するためのコマンド修飾子の詳細については、「一括インポートのバッチの管理」を参照してください。

    注意

    OPENROWSET 句の BULK オプションでは、バッチ サイズの制御がサポートされません。

  • トリガの無効化

    トリガを無効にすると、パフォーマンスが向上する可能性があります。

    トリガの実行が一括インポート操作に与える影響と、トリガを有効または無効にする方法の詳細については、「データの一括インポート時のトリガ実行の制御」を参照してください。

  • 制約の無効化

    制約チェックが一括インポート操作に与える影響と、テーブルの CHECK 制約と FOREIGN KEY 制約を有効または無効にする方法の詳細については、「一括インポート操作による制約チェックの制御」を参照してください。

  • データ ファイルのデータの順序付け

    既定の一括インポート操作では、データ ファイルが順序付けられていないと想定されます。テーブルにクラスタ化インデックスが含まれている場合、bcp ユーティリティ、BULK INSERT ステートメント、および OPENROWSET(BULK…) 関数 (Transact-SQL) を使用すると、一括インポート操作時にデータ ファイル内のデータをどのように並べ替えるかを指定できます。データ ファイルのデータをテーブルと同じ順序に並べ替える操作は省略できます。ただし、データ ファイルの順序をテーブルと同じにすることを指定すると、一括インポート操作のパフォーマンスが向上する可能性があります。

    詳細については、「データの一括インポート時の並べ替え順の制御」を参照してください。

  • ロック動作の制御

    一括インポート操作中のロック動作を指定する方法の詳細については、「一括インポートのロック動作の制御」を参照してください。

  • ネイティブ形式でのデータのインポート

    詳細については、「ネイティブ形式を使用したデータのインポートまたはエクスポート」および「Unicode ネイティブ形式を使用したデータのインポートまたはエクスポート」を参照してください。