2012-01-20 8 views
2

私は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> 

だから、ちょっとしたチェックとアドバイスをお願いします。

よろしく、

マーク

答えて

0

Entity Frameworkのは、いくつかの非常に大規模なクエリを追い出すことができますが、一般的にSQL Serverクエリオプティマイザは、その事を行い、クエリがやっと気付いサーバーで実行されます。一般的に賢明であることを越えて

、パフォーマンス分析は、私がボトルネックを持っている私に指示するまで、私は個人的に、パフォーマンスと最適化を心配しない傾向が賢明。すでにSQLプロファイラを使用している場合、クエリの実行に比較的長い時間がかかりますか?実行計画を見たことがありますか?それは大丈夫ですか?

+0

ありがとうございます。私はSQL Management Studioでそれを実行すると4秒かかる(もちろん、すべてが1回でリコールされるわけではない)もちろん、最初の実行から1秒後に実行されます。実際の実行計画は、ネストされたループ、インデックススキャン、およびスケーラ計算のめまぐるしく集まったものですが、ボトルネックとして飛躍するものはありません。私はProductsクラスをあまりにも引き下げていると思う。パフォーマンスが問題になる場合は、ストアドプロシージャと関数のインポートを使用することをお勧めしますか? – MagicalArmchair

+0

Hmmm - 2番目のクエリはかなり時間がかかる可能性があります。たぶんあなたは1.列挙値に基本的に沸騰するテーブルを削除することができます2.同じクエリを実行し、より速く実行するかどうかを確認するSPを書く3.問題のテーブルのカバリングインデックスを書き出し、あなたの 'Products'クラスデザインとそのクラスの使い方をもう一度見て、最初の読み込み後にクラスの要素のいくつかを遅延ロードすることができるかどうかを見てください。 –

関連する問題