2009-03-13 12 views

答えて

1

あなたは可能性:

MyContext.Items.InsertAllOnSubmit( 
    from i in list 
    select new Item 
    { 
     //map properties 
    }); 

Psと。その多くのデータを挿入しようとしませんでした

+1

これは非常に遅くなります。 LINQ-to-SQLはレコードごとに1つの挿入ステートメントを生成します。 –

0

LINQ2SQLはバッチ挿入をサポートしていません。独自のSQLを実行するか、それをサポートする別のフレームワークを使用してください(Entity Frameworkはそう思いますが、私は確信できません)。

+0

誰かが私の答えに問題がありますか?話す、私は聞くことができない。 – leppie

0

発信元の100,000の発信元がどこにあるかを正確に指定したい場合があります。

非データベースソースからレコードを取得する場合は、レコードを挿入するための最も速い方法は、InsertAllOnSubmitメソッドを使用することです。もちろん、これはトランザクション内の100,000個の挿入ステートメントを意味しますが、それ以上の細部はなく、この点で多くの選択肢はありません。

データベースからレコードを取得する場合は、ストアドプロシージャを呼び出す方がパフォーマンスが向上します。たとえば、ストアドプロシージャで:

INSERT INTO TableA 
SELECT * FROM TableB 

次に、LINQでストアドプロシージャを呼び出します。次いで、及び実行するSqlCommandを使用 -

質量データについて
+1

データベースでない場合でも、SqlBulkCopy経由でバルク転送を使用できます。 dbからだけでなく、IDataReaderを作成する方法はたくさんあります。 –

3

最速方法は、ステージングテーブルに(細工IDataReaderを介して)データをプッシュするSqlBulkCopyようなものを使用することである(同一のレイアウトを、ないインデックスの/ etc)ステージングテーブルから実テーブルにデータをプッシュするストアドプロシージャ。ただし、LINQ-to-SQLは(ストアドプロシージャの呼び出しに使用しない限り)ここには含まれていません。

通常のLINQ-to-SQL InsertOnSubmitを使用してみてください。最適化しようとする前に、データの量がどれほど大きいかを評価してください。準最適であっても「十分に速い」かもしれません。

IDataReaderはかなり簡単に作成できます。私はしばしばhereからcsvを使います。リストから1つを作成するには、hereからSimpleDataReaderを借りて、DoReadを上書きすることができます。

+0

この問題を自分自身で解決しようとしています.160,000レコードのためにInsertOnSubmitがこれまでのところ終わっています。 –

+0

あなたが立ち往生したら教えてください... –

関連する問題