1

.NET 用の MySql コネクタを使用して、MySql サーバーから SQL Server 2008 にデータをコピーしています。

次のいずれかを使用して、他のものよりも優れたパフォーマンスを経験した人はいますか?

  • DataAdapter と 500 のチャンクで DataTable に Fill を呼び出す
  • 500 のループで DataReader.Read を DataTable に

次に、SqlBulkCopy を使用して 500 の DataTable 行をロードし、MySql レコード セットが完全に転送されるまでループを続けます。

私は主に、適切な量のメモリを使用し、短時間で完了することに関心があります。

どんな助けでも大歓迎です!

4

2 に答える 2

3

私は SqlBulkCopy を使用したことはありませんが、一般的な経験則として、DataReader は通常、より優れたパフォーマンスを提供します。

DataReader は、基になるクエリがまだレコードを返している間に処理できます (データの処理を開始する前に、クエリが終了するのを待つ必要はありません)。DataReader は、データが利用可能になるとすぐにデータを返します。デフォルトでは (完全な結果セットではなく) アクティブなレコードのみをメモリに保存するため、メモリの使用量が削減されます。

DataAdapter は、完全な結果セットを DataTable/DataSet に読み込みます。これは、情報がメモリに格納される方法と追加の関連付けられた状態 (rowstate などを考えてください) により、オーバーヘッドが高くなります。

データを読み取るだけの場合は、常に DataAdapter よりも DataReader を使用します...何か間違っている場合は、誰かが私を修正してください。

いずれにせよ、SqlBulkCopy はレコードを反復処理するだけで、(Reflector によると) 最適化に DataTable を使用しないように見えるので、DataReader が最善の策だと思います。

于 2010-05-04T21:22:22.530 に答える
2

大量のデータを処理するときに、DataReader で SqlBulkCopy を使用しました。コピー前にデータセット全体が取得されるわけではないため、このプロセスは速度とメモリ使用量の点で非常に効率的であることがわかりました。BatchSize プロパティを適切な値、たとえば 500 に設定することをお勧めします。

于 2010-05-12T23:32:40.750 に答える