2009-07-02 8 views
2

私は、LINQ-to-SQLクラスのインスタンス化セットを反復処理しています。LINQ-to-SQLと大量変更が非常に遅いです。

この繰り返しの間、私は変更を加えたり、削除のフラグを付けたり、新しいものをdatacontextに挿入したりします。私が反復を終えると、私はcontext.SubmitChanges()を発射します - それは動作しますが、それは驚くほど遅いです。私はMSSQL 2008のエクスプレス版をローカルで実行しています。

また、更新が必要な行について、UPDATE文が生成されていることがわかりました。すべてのフィールド/列にはUPDATE SET ..... WHERE @p1 = ... AND @p2 = ...と表示されています。私はテーブルとDBMLスキーマのプライマリキーを定義しましたが、まだプライマリキーの代わりにUPDATEステートメントのすべての列を比較しているようです。

アイデア?


アップデート:私は恐れていたとおり、私は、主キーとテーブルの上に必要なインデックスを定義した後LINQツーSQLスキーマを更新するのを忘れていたので、それは

ました。

問題のボリュームは約40k行です。私の解決策のパフォーマンスには満足しています。

ボリュームが大きくなる場合は、Marcが参照している並行性チェックプロパティを調べます。

+0

私のLINQ-to-SQLスキーマは、DBスキーマでは最新ではないようです。それを更新して与える。 アイデアはまだありません。 – Anders

+0

行数を見積もりたいですか?それは20億円ですか? –

+0

2番目の投稿を質問にマージしました。質問を更新したりコメントを追加したりするのが簡単になります。 –

答えて

2

WHERE @p1 = ... AND @p2 =は、並行性チェックにリンクされています。このper-columnを無効にするか、代わりにタイムスタンプ/ rowversionを使用することができます(もっとよろしくお願いします)。 dbmlデザイナの "Update Check"と "Time Stamp"プロパティを見てください。テーブルにrowversionを追加して、テーブルをdbmlに再インポートするのが私の優先オプションです。

ここではどのような音量で話していますか?何百?何千?もっと?

LINQ-to-SQL(およびEF)は、OO単位で、したがって行単位で変更を行います。設定ベースの更新が進む方法には限界があり、すべての作業を1回のヒットで実行するストアドプロシージャを作成する必要があります。

が大量にに変更されても変更には時間がかかりますが、プライマリキーに適切なインデックスが作成されていないと問題が予想されます。

+0

ああ、ちょうどあなたのコメントを見た!申し訳ありませんが、ヒントのためにありがとうございます。 – Anders

関連する問題