SqlBulkCopyの推奨バッチサイズはどれくらいですか?


回答:


97

SQLServerインスタンスと同じ物理サーバーにインポートユーティリティがあります。カスタムを使用して、IDataReaderフラットファイルを解析し、を使用してデータベースに挿入しますSQLBulkCopy。一般的なファイルには、約600万の修飾行があり、平均して5列の10進数と短いテキストがあり、1行あたり約30バイトです。

このシナリオを考えると、5,000のバッチサイズが速度とメモリ消費の最良の妥協点であることがわかりました。私は500から始めて、もっと大きいもので実験しました。5000は平均で500より2.5倍速いことがわかりました。600万行の挿入には、バッチサイズが5,000の場合は約30秒、バッチサイズが500の場合は約80秒かかります。

10,000は測定可能なほど速くはありませんでした。50,000まで移動すると、速度が数パーセント向上しましたが、サーバーの負荷を増やす価値はありません。50,000を超えると、速度の向上は見られませんでした。

これは数式ではありませんが、使用するもう1つのデータポイントです。


3
考慮すべきことの1つは、テーブルが空でインデックスがあるかどうかです。そのような場合は、ここで説明するように、すべてを1つのバッチでアップロードすることをお勧めします。お勧めします。technet.microsoft.com en-us library ms177445(v = sql.105).aspx "インデックスを使用して空のテーブルにデータを一括インポートする場合バッチサイズを指定すると、最初のバッチの後でテーブルが空になりません。2番目のバッチから、データは完全にログに記録されます。空のインデックス付きテーブルの場合は、単一のバッチで一括インポートを実行することを検討してください。」
Sal

SqlBulkCopyは、ソース(DataTableなど)からSQLにデータをストリーミングするので、大きなバッチサイズでは、「サーバーの負荷が増加する」のでしょうか。(例えば50,000)
BornToCode

29

これは私もしばらく調べてきた問題です。C#コンソールアプリケーション(.Net 2.0)を使用して、SQL Server 2005データベースへの大きなCSVファイル(16 GB以上、6,500万レコード以上、および増大)のインポートを最適化することを検討しています。ジェレミーがいる既に指摘し、あなたの特定の状況のためにいくつかの微調整を行う必要がありますが、私はあなたが上とこの下の両方の最初の500のバッチサイズ、およびテスト値を持ってお勧めします。

このMSDNフォーラムの投稿から、バッチサイズの値を100〜1000でテストすることをお勧めしましたが、懐疑的でした。しかし、バッチサイズを100〜10,000でテストしたところ、アプリケーションに最適な値は500であることがわかりました。の500値SqlBulkCopy.BatchSizeここで推奨されます

SqlBulkCopy操作をさらに最適化するには、このMSDNアドバイスを確認してください。SqlBulkCopyOptions.TableLockを使用すると、読み込み時間を短縮できることがわかりました。


サーバー自体で一括コピーコマンドを実行すると、おそらく高速になると思います。
キャプテンケンパチ2014年

16

他の人が述べているように、それはあなたの環境、特に行のボリュームとネットワークの待ち時間に依存します。

個人的には、BatchSizeプロパティを1000行に設定することから始めて、それがどのように機能するかを確認します。それが機能する場合は、タイムアウトになるまで行数を2倍にします(たとえば、2000、4000など)。

それ以外の場合、タイムアウトが1000で発生した場合は、機能するまで行数を半分(たとえば、500)減らします。

いずれの場合も、スイートスポットが見つかるまで、最後に試行した2つのバッチサイズの差を2倍(成功した場合)または半分(失敗した場合)にします。

考慮すべきもう1つの要素は、行の単一バッチをコピーするのにかかる時間です。コピーされる行のバッチがBulkCopyTimeoutプロパティ(デフォルトでは30秒)を超えると、タイムアウトが発生します。BulkCopyTimeoutプロパティを2倍にして60秒にしてみてください。これにより、より多くのバッチ行のセットをコピーするための期間を長くすることができます。たとえば、50,000行のバッチは、30秒の制限時間をわずかに超える約40秒かかる可能性があるため、最大60秒に増やすとパフォーマンスが向上する可能性があります。


4

これはすべて、実装によって異なります。

ネットワークでどのような速度が期待できますか?FormsまたはASP.Netで使用していますか?進行状況をユーザーに警告する必要がありますか?総仕事の大きさはどれくらいですか?

私の経験では、バッチサイズを指定せずに一括コピーを実行すると、タイムアウトの問題が発生します。私は1000レコードのようなものから始めて、そこからいくつかの調整を行うのが好きです。


速度:さまざま、Webフォーム:はい、ASP.NET:はい、広いテーブル:はい、狭いテーブル、はい。数千行:はい。数百万行:はい。あなたがシナリオを考えることができるなら、私はおそらくそれをやっています。
ジョナサンアレン

1
その時は前の答えに固執しなければなりません。銀の弾丸はないと思います。
ジェレミー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.