1

エンティティフレームワーク(.NET 3.5を搭載したv1)を使用するプロジェクトがあります。数年前から使用されていますが、今ではより多くの人に使用されています。タイムアウトエラーが発生し始め、いくつかの問題を追跡しました。簡単にするために、データベースにproduct、part、product_partの3つのテーブルがあるとします。約1400の部品と少数の製品があります。

ユーザーは、製品に任意の数の部品を追加することができます。私の問題は、製品に多くの部品が追加されている場合、インサートに長い時間がかかることです。これは主にネットワークトラフィック/遅延が原因だと思いますが、1400をすべて挿入するには約1分かかります。誰かが入って、それらのレコードが挿入されている間にパーツの詳細を表示しようとすると、タイムアウトが発生し、SQLServerのアクティビティモニターにブロックが表示されます。

これを回避するにはどうすればよいですか?これが以前に尋ねられて、私がそれを逃したならば、私の謝罪。

ありがとう、
ニック

4

1 に答える 1

1

根本的な問題は、書き込みトランザクションに非常に時間がかかることだと思います。EFは大量のDMLの実行が苦手です。個別のネットワークラウンドトリップおよび個別のステートメントで各挿入を実行します。

1400行を挿入する必要があり、パフォーマンスが重要な場合は、TVP()を使用して1つのステートメントに挿入しINSERT ... SELECT * FROM @tvpます。または、一括コピーに切り替えますが、1400行だけでは有利ではないと思います。

読み取りトランザクションがブロックされており、これが問題である場合は、スナップショットアイソレーションをオンにします。リーダーはスナップショットアイソレーションでブロックされないため、これでリーダーは100%処理されます。

于 2012-12-07T18:03:44.393 に答える