推奨されるバッチサイズはSqlBulkCopy
どれくらいですか?パフォーマンスチューニングの開始点として使用できる一般的な式を探しています。
回答:
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つのデータポイントです。
これは私もしばらく調べてきた問題です。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を使用すると、読み込み時間を短縮できることがわかりました。
他の人が述べているように、それはあなたの環境、特に行のボリュームとネットワークの待ち時間に依存します。
個人的には、BatchSize
プロパティを1000行に設定することから始めて、それがどのように機能するかを確認します。それが機能する場合は、タイムアウトになるまで行数を2倍にします(たとえば、2000、4000など)。
それ以外の場合、タイムアウトが1000で発生した場合は、機能するまで行数を半分(たとえば、500)減らします。
いずれの場合も、スイートスポットが見つかるまで、最後に試行した2つのバッチサイズの差を2倍(成功した場合)または半分(失敗した場合)にします。
考慮すべきもう1つの要素は、行の単一バッチをコピーするのにかかる時間です。コピーされる行のバッチがBulkCopyTimeout
プロパティ(デフォルトでは30秒)を超えると、タイムアウトが発生します。BulkCopyTimeout
プロパティを2倍にして60秒にしてみてください。これにより、より多くのバッチ行のセットをコピーするための期間を長くすることができます。たとえば、50,000行のバッチは、30秒の制限時間をわずかに超える約40秒かかる可能性があるため、最大60秒に増やすとパフォーマンスが向上する可能性があります。
これはすべて、実装によって異なります。
ネットワークでどのような速度が期待できますか?FormsまたはASP.Netで使用していますか?進行状況をユーザーに警告する必要がありますか?総仕事の大きさはどれくらいですか?
私の経験では、バッチサイズを指定せずに一括コピーを実行すると、タイムアウトの問題が発生します。私は1000レコードのようなものから始めて、そこからいくつかの調整を行うのが好きです。