私はEntity Frameworkのために私の古いADO.Netの方法を変更しています。 My Productsクラスは約20のテーブルから構成されています(そのうちの3つはこれまで1つのクラスにまとめました)。5つのProductタイプテーブルもありますので、ProductクラスAbstractを作成しました。 Entity Frameworkが以下のようにTable per Typeメソドロジを使用して提供する素敵な継承。そのため、製品クラスの3つのテーブルと5つの製品タイプテーブルがあり、それぞれが独自のクラスをProductから派生しています。エンティティフレームワーク生成されたSQL - タイプごとのテーブル - 実行者?
<there was a screenshot here, I don't have the rep to post it though!>
私が取り組んできたように、このEDMは、SQL Serverプロファイラでのカバーの下にやっていることに目を保ってきました。私は以下のようにエンティティクエリに簡単なLINQのを実行すると:アーカイブされていない製品のすべてのタイプに戻します、そして潜在的にもそこにIDの検索を有していても良い
var model = from p in Product.Products
where p.archive == false && ((Prod_ID == 0) || (p.ID == Prod_ID))
select p;
、SQLプロファイラは、私にを示し800行 SQLの一片!
これは正常ですか?そしてこの演奏家は?あるいは私はエンティティフレームワークを狂ったように送りましたか?
<I tried to post the SQL too, but there was too much of it for the post>
だから、ちょっとしたチェックとアドバイスをお願いします。
よろしく、
マーク
ありがとうございます。私はSQL Management Studioでそれを実行すると4秒かかる(もちろん、すべてが1回でリコールされるわけではない)もちろん、最初の実行から1秒後に実行されます。実際の実行計画は、ネストされたループ、インデックススキャン、およびスケーラ計算のめまぐるしく集まったものですが、ボトルネックとして飛躍するものはありません。私はProductsクラスをあまりにも引き下げていると思う。パフォーマンスが問題になる場合は、ストアドプロシージャと関数のインポートを使用することをお勧めしますか? – MagicalArmchair
Hmmm - 2番目のクエリはかなり時間がかかる可能性があります。たぶんあなたは1.列挙値に基本的に沸騰するテーブルを削除することができます2.同じクエリを実行し、より速く実行するかどうかを確認するSPを書く3.問題のテーブルのカバリングインデックスを書き出し、あなたの 'Products'クラスデザインとそのクラスの使い方をもう一度見て、最初の読み込み後にクラスの要素のいくつかを遅延ロードすることができるかどうかを見てください。 –