2013-03-20 1 views
7

バルクロードのパフォーマンスを向上させるために取り組んでいます。毎日何百万件ものレコードが100件あります。SqlBulkCopyのパフォーマンス

これをデータテーブルの代わりにIDatareaderインターフェイスを使用するように変更し、パフォーマンスが大幅に向上しました(1分あたり50万レコード増加)。現在の設定は次のとおりです。

  • 区切られたファイルを解析するカスタムキャッシュリーダーです。
  • ストリームリーダーをバッファリングされたストリームにラップします。
  • オブジェクトを列挙し、IDatareaderインターフェイスを実装するカスタムオブジェクトリーダークラスです。
  • その後SqlBulkCopyは、パフォーマンスのボトルネックの大部分はSqlBulkCopy.WriteToServerに直接あるサーバー

を書き込みます。私がユニットテストを行う場合には、WriteToServerだけを除いて、約1分でプロセスが戻ります。 WriteToServerはさらに15分以上かかる。単体テストの場合、ローカルマシン上にあるので、データベースが同じドライブ上にあるため、ネットワークを介してデータをコピーする必要はありません。

ヒープテーブルを使用しています(インデックスはありません、クラスター化されているか、クラスター化されていない、パフォーマンスに大きな違いはなく、さまざまなバッチサイズで使用しています)。

負荷時間を減らす必要があるので、誰かが今このターンアップからもう少し血を絞る方法を望んでいると思っています。

+1

あなたはリリースモードを実行していますか?ビットとは何ですか?プロファイリングしましたか? 15分以上の間に、CPU負荷は主にサーバーまたはクライアントに負荷されますか?どのくらいのデータを実際にコピーしていますか?一括コピーにはどのような設定を使用しましたか?コピー中のI/O負荷は何ですか? –

+0

はい、これはリリースモードです。 32私のローカルで私はユニットテストです。クライアントはdbと同じボックスで実行されています。プロセスの約12%のCPU使用量と80Kのメモリを安定して保持します。このユニットは1200万レコードをテストします。私はテーブルロック設定を使用しました。良いアイデア、私はこのプロセスでSQLプロファイラを実行し、何かを変えるかどうかを確認します。 –

+0

クライアントプロセスとサーバープロセスのCPU負荷を意味します。あなたはここではSQLプロファイラ以上のことを伝えるかもしれないクライアント用のCPUプロファイラを見るべきです - SQL側が非常にシンプルな(それは良い)と聞こえます。 12%のCPU負荷 - それは8コアマシンの1コアが限界に達した可能性がありますか? 1レコードは何バイトですか?ああ、最後に、デバッガを接続せずに実行していますか(リリースモードでも可能です)。 –

答えて

1

なぜSSISを直接使用しないのですか?

とにかく、あなたがIDataReaderへの解析から逃れた場合、あなたはすでに正しい道にいるのです。 SqlBulkCopy自体を最適化するには、フォーカスをSQL Serverに変更する必要があります。キーは最小限の操作で記録されます。これらのMSDN記事を読む必要があります:

あなたのターゲットはBツリー(つまり、クラスタ化インデックス付きテーブル)パフォーマンスの一括挿入、すなわち、ソートされた入力行セットの最も重要な教義の残念なものである場合、宣言することはできません。これはシンプルなので、ADO.Net SqlClientにはSSPROP_FASTLOADOPTIONS -> ORDER(Column)(OleDb)に相当するものはありません。エンジンはデータが既にソートされていることを知らないので、ソート演算子をプランに追加します。こぼれないように、小さなバッチサイズ(〜10k)を使用してください。私のオリジナルポイントを参照してください:これらはすべてOleDB MSDN仕様を掘り下げるのではなく、options and clicks to set in SSISです。

データストリームのソートが未開始か、デスティネーションがヒープの場合は、上記のポイントはミュートです。

しかし、最小限のロギングを達成することは、まともなパフォーマンスのためにはまだ必要です。

+0

私は、DBが焦点であることに同意します。特に一括コピーまでのすべてが飛ぶことを考えれば、 5700万のレコードが57秒で完了します。ユニットテストのために私のローカルでは、簡単なロギングを使用していますが、それはexpress editionです。私は、新しいDBを作成し、簡単なロギングを使用して、devボックス(エンタープライズ版)のいずれかでこれをテストします。 –

+0

シンプルリカバリモデルでは、最小限のログ操作しかできません。しかし、他のすべての要因が必要です。また、Express版では、IOサブシステムが通常のコンシューマグレード(例えば、5400RPMの単一ドライブ)であると仮定します。 IOがボトルネックになっている場合は、高速ドライブでテストする必要があります。 –

+0

これは、より多くのリソースを持つサーバー上でこれを実行し、単純な回復データベースを作成しました。これにより、2.6万ドルからさらに60万レコード増加しました。このすべてが始まった場所よりも110万人以上。私はまた、いくつかの大きな有望な数値でSQLの一括コピーのための複数のスレッドを使用していくつかのテストを行った。 4つのスレッドは1分間に600万回にジャンプしました。 8人は1分間に1200万人に急上昇した。かなり有望ですが、おそらくCPU使用率のために8スレッドを使って複数のボックスに対してそれを配布する必要があります。 –

関連する問題