2013-05-06 8 views
7

私はデータアクセスレイヤーでEntity Framework 5、ObjectContextおよびPOCOを使用しています。ジェネリックリポジトリの実装があり、Skip()およびTake()を使用してページングを使用してデータベースにクエリを行うメソッドがあります。すべて(I約170K行を話している)の行の多くをスキップするとき、クエリのパフォーマンスが非常に遅いことを除いて、正常に動作しますEntity Framework Skipメソッドの実行が遅い

これはエンティティへのLINQの私の質問の抜粋です:

C#コード:私は代わりに直接景色をROW_NUMBER()句そのサブクエリを作成し、ROW_NUMBERを適用()を使用していることに気づい-SQLを取引を翻訳されたクエリーに

ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection); 
var idPred = oc.CreateObjectSet<view_Trans>("view_Trans").AsQueryable(); 
idPred = idPred.OrderBy(sortColumn, sortDirection.ToLower().Equals("desc")); 
var result = idPred.Skip(iDisplayStart).Take(iDisplayLength); 
return new PagedResult<view_Trans>(result, totalRecords); 

サブクエリの結果に...

例:

select top(10) extent1.A, extent1.B.extent1.C from (
select extent1.A, extent1.B, extent1.C, 
row_number() OVER (ORDER BY [Extent1].[A] DESC) AS [row_number] 
from (
select A,B,C from table as extent1)) as extent1 
WHERE [Extent1].[row_number] > 176610 
ORDER BY [Extent1].[A] DESC 

これが完了するまでに約165秒かかります。どのように変換されたクエリステートメントのパフォーマンスを向上させる上の任意のアイデア?

+2

クエリがスキップなしで高速であるため、この問題は、Entity Frameworkのパフォーマンスに関する他の考慮事項ではなく、SQLに問題があることを示しています。したがって、まずSQLプロファイラを使用してクエリが遅い理由を診断することです。あなたはこれを試しましたか?あなたは何を見つけましたか? –

+0

私はすでにそれをしました。 Entity Frameworkの代わりにLinqToSqlを使用して同じクエリを作成すると、結果が同じでなく、クエリがより速く(約30秒)、Entity Frameworkによって構築されている不要なサブクエリにあると思います。上記の例でSqlが表示されている場合、テーブルへの不要なサブクエリがあり、row_numberはテーブルに適用されず、そのサブクエリの結果に適用されます。 – Boanerge

+0

それは実際に私の質問に答えるものではありません。あなたが責任を負うサブクエリは、完了するのに165秒かかるEFクエリの多くに現れます。 SQLプロファイラは、より具体的な情報を提供する必要があります。正確に何が165を引き起こしていますか? –

答えて

0

遅い理由の1つは、おそらくSQLが行を2回並べているということです。

私が知っている唯一のオプションは、idPred.SqlQuery( "Select ..."、params)を呼び出すことです。これにより、データ要求に対して独自の最適化クエリを記述することができます。

+2

あなたが私に投票するつもりなら、私の答えが間違っていることを教えてください。 –

1

上記のコメントに従わない人は、SELECTが、実行に165秒かかる多くの多くのEFクエリに存在するため、追加のSELECTではないと思われました。私は最終的に彼のObjectSetがVIEWを参照していて、それが問題の一部かどうか疑問に思った。いくつかの実験の後、彼は問題をビュー内のLEFT JOINに絞り込んだ。私は彼がそのクエリでDatabase Tuning Advisorを実行したことを示唆しました。彼はそうし、2つの指数は問題を解決することを示唆した。

関連する問題