質問: GetBulkCopy(); bcp.WriteToServer(data); }); ====> end loging time ``` タイミングが記録され、キューを作成する部分は決して重要なチャンクをとらない **UPDATE2**私は、そのサイクルでの各操作の所要時間を収集し、レイアウトは次のように実装しました。 * `queue.Skip().Take()` - 無視できる * `MakeDataTable(batch)` - 10% * `GetBulkCopy()` - 無視できる * `WriteToServer(data)` - 90% **UPDATE3**私はSQLの標準バージョンを設計しているので、エンタープライズ版でしか利用できないため、パーティショニングに頼ることはできません。しかし、私はパーティション方式の変種を試しました: * 作成された16のファイルグループ(G0〜G15)、 * 個々のグループにバインドされた16個のテーブルのみを挿入用に作成しました(T0〜T15)。テーブルにはインデックスがまったくなく、クラスタ化されたint同一性もありません。 * データを挿入するスレッドは、それぞれ16個のテーブルすべてを循環します。これにより、各バルク挿入操作で独自のテーブルが使用されることがほとんど保証されます これにより、バルクインサートの〜20%の改善が得られました。 CPUコア、LANインタフェース、ドライブI / Oは最大化されておらず、最大容量の約25%で使用されていました。 **UPDATE4**私は今それが得られるほど良いと思う。私は、以下の手法を使ってインサートを合理的な速度にプッシュすることができました: * 各バルクインサートはそれ自身のテーブルに入り、結果はメインのものにマージされます * 一括挿入ごとにテーブルが新しく再作成され、テーブルロックが使用されます * DataTableではなくIDataReaderの実装をここから使用します。 * 複数のクライアントからの一括挿入 * 各クライアントは、個々のギガビットVLANを使用してSQLにアクセスしています * メインテーブルにアクセスする側のプロセスはNOLOCKオプションを使用します * 競合を解消するためにsys.dm_os_wait_statsとsys.dm_os_latch_statsを調べました 私はこの時点で答えられた質問のクレジットを得た人を決定するのは難しい時期です。あなたが「答えた」人がいない人は、私は謝罪します。それは本当に厳しい決定でした。 **UPDATE5** :以下の項目はいくつかの最適化を使用できます: * DataTableではなくIDataReaderの実装をここから使用します。 大規模なCPUコア数を持つマシン上でプログラムを実行しない限り、いくつかのリファクタリングを使用することができます。 get / setメソッドを生成するためにリフレクションを使用しているので、それがCPUの大きな負荷になります。パフォーマンスがキーの場合は、リフレクションを使用する代わりに、IDataReaderを手動でコーディングしてコンパイルするときに多くのパフォーマンスを追加します
回答: バルクロード用のSQL Serverのチューニングに関する推奨事項については、MSのデータロードおよびパフォーマンスガイドのペーパー、およびオンラインブックからのバルクインポートの最適化に関するガイドラインを参照してください。 SQL Serverからのバルクロードに重点を置いていますが、ほとんどのアドバイスはクライアントAPIを使用したバルクロードに適用されます。このペーパーはSQL 2008に適用されます。あなたが目標としているSQL Serverのバージョン どちらも詳細な情報を持っています。しかし、いくつかのハイライト: * 一括操作を最小限にログします。バルクログまたはシンプルリカバリを使用します。 traceflag 610を有効にする必要があるかもしれません(ただし、これについては注意が必要です) * バッチサイズを調整する * ターゲット表をパーティション化することを検討する * バルクロード中にインデックスを削除することを検討する このフローチャートのデータロードとパフォーマンスガイド : !ここに画像の説明を入力 あなたの実験でIOが制限ではないかもしれないことが示唆されているので、他の人が言っているように、ボトルネックの原因を確立するためにいくつかの性能カウンターを取得する必要があります。 データロードとパフォーマンスガイドには、監視するSQL待機タイプとパフォーマンスカウンタのリストが含まれています(リンクするドキュメントにはアンカーはありませんが、ドキュメントの「バルク負荷の最適化」の項では、ドキュメントの約75%です)。 *更新* リンクを見つけるのに私はしばらく時間がかかりましたが、Thomas KejserによるこのSQLBitsの講演は価値があります。 スライド全体を見る時間がない場合はスライドが利用できます。ここにリンクされている資料の一部を繰り返しますが、特定のパフォーマンスカウンターの発生率が高いことに対処する方法については、他にもいくつかの提案があります。