2012-02-22 5 views
1

私はリモートSQLサーバを持っています。このサーバーのすべてのテーブルのローカルコピーを作成します。ローカルで使用されているファイル形式は気にしませんが、SQLサーバーからファイルにデータを取り込む最も早い方法を探しています。 SQLサーバテーブルをファイルに書き込む速い方法

ステップ1

これは私の現在のアプローチである(注サーバー側のバックアップはオプションではありません)。リーダーを作成し、オブジェクト

while (reader.Read()) { 

    var fieldCount = reader.FieldCount; 
    for (int i = 0; i < fieldCount; i++) { 
     objects.Add(reader.GetValue(i)); 
    } 
} 

ステップ2のリストにすべてのデータを読み取ります。

List<string> test = new List<string>(); 
foreach (var o in objects) { 
    test.Add(o.ToString()); 
} 

ステップ3を文字列にオブジェクトを変換します。 (CSV)に文字列を書き込み、私はこれらの3つのステップのパフォーマンスを測定しました

foreach (var s in test) { 
    backupFile.Write("\""); 
    backupFile.Write(s); 
    backupFile.Write("\";"); 
} 

ファイル:

  • ステップ1、ステップ2は、2.8秒
  • をとる3秒
  • を取ります
  • ステップ3は0.8秒かかる

私はステップ2をスピードアップする方法を探しています。これらのオブジェクトをファイルに素早く取得する方法はありますか? (テキストファイルである必要はありません。ローカルデータベースファイルのバイナリもOKです)

+1

おそらくT-SQLクエリでこれらの操作を実行して、C#の各レコードを調べる代わりにCSV形式のすべてを返すことができます。 – Alexandre

+0

なぜデータを1回ループするだけでなく、クエリから各行を読み込むときに文字列変換とファイル書き込みを行うのはなぜですか? – mbeckish

+0

私の推測では、SQL Serverの[一括エクスポート機能](http://msdn.microsoft.com/en-us/library/ms175937.aspx)を使用するのが最も速いメカニズムだと思います。 bcp.exeユーティリティがあります。これは、あなたがやりたいこととほぼ同じように見えます。 –

答えて

0

ローカルで使用するファイル形式について気にしない場合、SQLテーブルをDataTableオブジェクトにロードして使用する方法:

datatable.WriteXml("c:\YourFile.xml"); 
+0

これはおそらくはるかに遅いでしょう –

+0

@Conrad。正しい。 DataTableへの読み込みは、私が現在使用している方法よりもずっと遅いです –

+0

テーブル全体をメモリにロードすることは言うまでもありませんが、私の場合は数百万行になります。 :/ –

3

なぜ3つのステップで正確に気になりますか?

なぜ

while (reader.Read()) { 

    var fieldCount = reader.FieldCount; 
    for (int i = 0; i < fieldCount; i++) { 
      backupFile.Write("\""); 
      backupFile.Write(reader.GetValue(i).ToString()); 
      backupFile.Write("\";");; 
    } 
    backupFile.WriteLine(); 
} 

もちろん、次の2つのスレッドを使用している場合を除き。データをコレクションにプッシュするもの。そして、データをファイルにフラッシュするもの。

+0

パフォーマンスを測定できるように、コードをステップに分割しました。最終的な結果は実際には1つのループになりますが、それほど目立つことはありません。 –

+0

私はあなたが 'ToString()'を改善できるとは思っていませんが、ファイルを書き出している間にデータベースからフェッチできるように、別のスレッドに置くことを検討したいと思うかもしれません。 (どちらもCPUバインディングの代わりにIOバインド操作です) –

0

OPENROWSETコマンドを使用します。例:

INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=C:\testing.xls;', 
'SELECT Name, Date FROM [Sheet1$]') 
SELECT [Name], GETDATE() FROM MyTable 
+0

このc:\ testing.xlsはサーバーに置かれますか?私はクライアント上でそれが必要です。現在のソリューションでは、クライアントからこのファイルをダウンロードできる方法はありません(自動化) –

関連する問題