web-dev-qa-db-ja.com

一括インポートが大量のINSERTより速いのはなぜですか?

私は、ファイルからSQL Serverテーブルにデータをインポートする方法についての大学院の研究を書いています。私は自分のプログラムを作成しましたが、今、それをbcp、BULK INSERT、INSERT ...それらを解析し、通常のINSERTを使用して1つずつインポートします。ファイルには、それぞれ4列の100万行が含まれています。そして今、私は私のプログラムが160秒かかり、標準的な方法は5-10秒かかる状況にあります。

それで問題は、なぜBULK操作がより速いのですか?彼らは特別な手段を使っていますか?説明してもらえますか、それとも役立つリンクなどを教えてください。

8
zer_ik

BULK INSERTは、最小限のログに記録される操作にすることができます(インデックス、テーブルの制約、データベースの復旧モデルなどのさまざまなパラメーターによって異なります)。最小限のログ記録操作では、割り当てと割り当て解除のみが記録されます。 BULK INSERTの場合、実際に挿入されるデータではなく、エクステント割り当てのみがログに記録されます。これにより、INSERTよりもパフォーマンスが大幅に向上します。

一括挿入と挿入の比較

実際の利点は、トランザクションログに記録されるデータの量を減らすことです。
BULK LOGGEDまたはSIMPLEリカバリモデルの場合、利点は重要です。

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

この回答を読むことも検討してください: テーブルに挿入*テーブルからの挿入vs一括挿入

ところで、BULK INSERTのパフォーマンスに影響を与える要因があります。

テーブルに制約またはトリガー、あるいはその両方があるかどうか。

データベースで使用される復旧モデル。

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

テーブルにインデックスがあるかどうか。

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

データが単一のクライアントからコピーされているか、複数のクライアントから並行してコピーされているか。

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

11
Hybris95

まず、行に行を挿入することは最適ではありません。設定ロジックについては この記事 を、SQL Serverにデータをロードするための最速の方法については この記事 を参照してください。

2番目に、BULKインポートは大きな負荷向けに最適化されています。これはすべて、SQL Serverでのページフラッシュ、ログへの書き込み、インデックスなど、さまざまなことに関係しています。 BULK INSERTを最適化する方法に関するTechnetの記事があります。これにより、BULKがどのように高速であるかがわかります。ただし、2回を超えてリンクすることはできないため、「一括インポートパフォーマンスの最適化」をググる必要があります。

0
DrTrunks Bell

あなたはそれに多くの記事を見つけることができると思います、「なぜ一括挿入がより速いのか」を検索してください。たとえば、これは良い分析のようです:

https://www.simple-talk.com/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods/

一般に、どのデータベースでも、1つの挿入に対して多くの作業があります。制約のチェック、インデックスの作成、ディスクへのフラッシュです。この複雑な操作は、エンジンを1つずつ呼び出すのではなく、1回の操作で複数回実行するときにデータベースによって最適化できます。

0
Galcoholic