2011-01-20 8 views
1

従来のSQL Expressシステムから大量のデータをSQL CEに基づく新しいシステムに変換するプログラムを作成しようとしています。ここで何が起こっているの迅速なスナップショットです:SQL CE/LINQによる一括操作

  • SQL Expressはインストール内のテーブルのほとんどは小さな(< 10Kレコード)です
  • 1つのテーブルが--extremely--大きく、はるかに超える100万ですレコード

小さなテーブルの場合は、LINQを使っても問題ありませんが、大きなテーブルで問題が発生します。標準的な方法:

foreach(var dataRow in ...) 
{ 
    table.InsertOnSubmit(dataRow); 
} 

database.SubmitChanges(); 

痛みを伴い、完了に数時間かかる。私も、試してみて、ループの終わりに1つの巨大な挿入を排除するために、いくつかの単純な「バルク」の操作を行ってみましたつまり:私のような比較的小さな値から、バルク様々なサイズを試してみた

foreach(var dataRow in ...) 
{ 
    if(count == BULK_LIMIT) 
    { 
     count = 0; 
     database.SubmitChanges(); 
    } 

    count++;  
    table.InsertOnSubmit(dataRow); 
} 

// Final submit, to catch the last BULK_LIMIT item block 
database.SubmitChanges(); 

1K-5Kから最大300Kまでの大型サイズ

最終的に私は立ち往生しており、バルクサイズに関係なく、プロセスにはほぼ同じ時間(数時間)がかかります。

だから誰も速度を上げる方法を知っていますか?典型的なソリューションはSqlBulkCopyを使用することですが、SQL CEと互換性がありません。

ノートのカップル:

  • は、はい、私は実際にSQL CEのすべてのレコードをしたいです、はい私は、セットアップ4ギガバイトで最大のデータベースを許可する接続をしました。
  • はい、私は本当に1M +レコードのすべての最後の必要があります。
  • 各データ行の内容はすべてプリミティブで、文字列とタイムスタンプが混在しています。
  • 従来のSQL Expressデータベースのサイズは〜400 MBです。

ご協力いただきありがとうございます。

- ダン

+0

〜400メガバイト=約400メガバイト:クリスTackeはSqlCeResultsetを使用して、ここで最速のソリューションを持っていますか? –

+0

はい、そうです。 –

答えて

1

は、パラメータ化INSERT文を使用します、コマンドを準備するループ内でパラメータ値を設定し、各INSERTで同じコマンドを再利用します。

インデックスを削除し、すべてのINSERTを実行した後に再適用します。

更新Bulk Insert In SQLCE

+0

ありがとう!それは素晴らしい仕事でした。 40分から4時にダウン! – debracey

+1

私はここにSQL Compact Bulk Insertのライブラリを持っています:http://sqlcebulkcopy.codeplex.com(SqlCeResultSetを使用) – ErikEJ

関連する問題