私は、ファイルからSQL Serverテーブルにデータをインポートする方法についての大学院の研究を書いています。私は自分のプログラムを作成しましたが、今、それをbcp、BULK INSERT、INSERT ...それらを解析し、通常のINSERTを使用して1つずつインポートします。ファイルには、それぞれ4列の100万行が含まれています。そして今、私は私のプログラムが160秒かかり、標準的な方法は5-10秒かかる状況にあります。
それで問題は、なぜBULK操作がより速いのですか?彼らは特別な手段を使っていますか?説明してもらえますか、それとも役立つリンクなどを教えてください。
BULK INSERTは、最小限のログに記録される操作にすることができます(インデックス、テーブルの制約、データベースの復旧モデルなどのさまざまなパラメーターによって異なります)。最小限のログ記録操作では、割り当てと割り当て解除のみが記録されます。 BULK INSERTの場合、実際に挿入されるデータではなく、エクステント割り当てのみがログに記録されます。これにより、INSERTよりもパフォーマンスが大幅に向上します。
実際の利点は、トランザクションログに記録されるデータの量を減らすことです。
BULK LOGGEDまたはSIMPLEリカバリモデルの場合、利点は重要です。
この回答を読むことも検討してください: テーブルに挿入*テーブルからの挿入vs一括挿入
ところで、BULK INSERTのパフォーマンスに影響を与える要因があります。
テーブルに制約またはトリガー、あるいはその両方があるかどうか。
データベースで使用される復旧モデル。
データのコピー先のテーブルが空かどうか。
テーブルにインデックスがあるかどうか。
TABLOCKが指定されているかどうか。
データが単一のクライアントからコピーされているか、複数のクライアントから並行してコピーされているか。
SQL Serverが実行されている2台のコンピューター間でデータをコピーするかどうか。
まず、行に行を挿入することは最適ではありません。設定ロジックについては この記事 を、SQL Serverにデータをロードするための最速の方法については この記事 を参照してください。
2番目に、BULKインポートは大きな負荷向けに最適化されています。これはすべて、SQL Serverでのページフラッシュ、ログへの書き込み、インデックスなど、さまざまなことに関係しています。 BULK INSERTを最適化する方法に関するTechnetの記事があります。これにより、BULKがどのように高速であるかがわかります。ただし、2回を超えてリンクすることはできないため、「一括インポートパフォーマンスの最適化」をググる必要があります。
あなたはそれに多くの記事を見つけることができると思います、「なぜ一括挿入がより速いのか」を検索してください。たとえば、これは良い分析のようです:
一般に、どのデータベースでも、1つの挿入に対して多くの作業があります。制約のチェック、インデックスの作成、ディスクへのフラッシュです。この複雑な操作は、エンジンを1つずつ呼び出すのではなく、1回の操作で複数回実行するときにデータベースによって最適化できます。