2011-10-18 10 views
2

恐ろしいパフォーマンスである60人の雇用者に対して、コードを実行するには約3秒かかります。私のコードを約0.5秒で実行したいと思います。私は自分のデータベースに5つのテーブルを必要とするメソッドを持っています。クエリには.include("AdjescentTable")しかないので、3つのクエリを作成し、結果を取得してEmployeeに追加する必要があります。エンティティフレームワークの複数テーブルクエリ

var feuilleDeTemps = from fdt in context.FT.Include("FTJ") where 
(fdt.ID_Employe == employe.ID_Employe) && 
(fdt.DateDepart <= date) && 
(fdt.DateFin >= date) 
select fdt; 

var horaireEmploye = from h in context.HR 
where h.ID_Employe == employe.ID_Employe 
select h; 

var congeCedule = from cc in context.CC.Include("C") 
where (cc.ID_Employe == employe.ID_Employe && 
cc.Date <= dateFin && 
cc.Date >= dateDebut) 
select cc; 

Employe.FeuilleDeTemps = feuilleDeTemps; 
Employe.horaireEmploye = horaireEmploye; 
Employe.congeCedule = congeCedule; 

return Employe; 

上記の3つのクエリを60回実行すると約0.7秒かかり、データベースには多くの行がありません。これらの3つのクエリのセットについては、FTJでは約300行、HRでは500行、CCでは500行、FTJでは約500行、HRでは500行、CCでは500行、 Cで500行。

もちろん、これらは実際の名前ではありませんが、わかりやすくするためにemを短くしました。

私はDateTime.NowとTimeSpansを使用して各クエリの時間を決定しました。 SQL Serverで3つのクエリを直接実行すると、約300ミリ秒かかります。ここで

は私のSQLクエリです:

Select e.ID_Employe, ft.*, ftj.* FROM Employe e 
INNER JOIN FeuilleDeTemps ft 
ON e.ID_Employe = ft.ID_Employe 
INNER JOIN FeuilleDeTempsJournee ftj 
ON ft.ID_FeuilleDeTemps = ftj.ID_FeuilleDeTemps 
WHERE ft.DateDepart >= '2011-09-25 00:00:00.000' AND ft.DateFin <= '2011-10-01 23:59:59.000' 

Select e.ID_Employe, hr.* FROM Employe e 
INNER JOIN HoraireFixeEmployeParJour hr 
ON hr.ID_Employe = e.ID_Employe 

Select e.ID_Employe, cc.* FROM Employe e 
INNER JOIN CongeCedule cc 
ON cc.ID_Employe = e.ID_Employe 
INNER JOIN Conge c 
ON c.ID_Conge = cc.ID_Conge 

は、我々はWCF、Entity FrameworkのとLINQ

がなぜこのEntity Frameworkの上に多くの時間を取っているとどのように私はそれを改善することができますでしょうか?

+0

すべてを3文字以下に短縮しないと、あなたの質問はおそらくもっと明確になりました。:-P –

+0

(フレームワークについては何も知らないうちに...)複数の 'あなたのフレームワークのクエリに「結合」または「包含」しますか?また、単一のビューを作成してエンティティを作成することはできますか?あなたが何かを更新していない場合、それは公正なビットを簡略化するかもしれません... –

答えて

2

なしの答えと質問の束:

はあなたがあなたが欠けている仕事をするために選択されているすべてのフィールドを必要としますか?あなたは前向きなクエリの数を減らすために怠惰な負荷をかけることができる子供がいますか?

セッション中にこのコードを複数回実行するとどうなりますか?時間が経つと性能が向上しますか?その場合、EFが毎回式ツリーをTSQLに繰り返し解析する必要がないように、コンパイルされたクエリを使用するようにクエリの一部を変更することを検討することをお勧めします(注:4.2ではこれが自動的に行われます)。

アプリケーションをプロファイルして、期待していない他のクエリが実行されていないことを確認しているとします。また、クエリアナライザを使用してプロファイルトレースを実行して、テーブルに適切なインデックスが存在することを確認しています。

+0

私はすべてのフィールドが必要です、私は私のアプリケーションにデータを返す必要がありますbeacause lazyload beacause。表示されているコードはWCFサービスにあります。コードを実行すると約0.2秒かかりますが、それは一定ではありません。 – Gab

+1

あなたのLINQ/EFでコンパイルされたクエリを試してみてください。あなたのperf問題の一部は、EFによるクエリエバリュエーションとSQLによるクエリプランエバリュエーションです。ここで銀色の弾丸がないかもしれないと恐れて、あなたはこの1つについてかなりの量のプロファイリングを行う必要があります。 –

+0

ilは確かにコンパイルされたクエリーを試し、ヒントのためにさらにプロファイリングを行います^^ – Gab

関連する問題