私はデータアクセスレイヤーで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秒かかります。どのように変換されたクエリステートメントのパフォーマンスを向上させる上の任意のアイデア?
クエリがスキップなしで高速であるため、この問題は、Entity Frameworkのパフォーマンスに関する他の考慮事項ではなく、SQLに問題があることを示しています。したがって、まずSQLプロファイラを使用してクエリが遅い理由を診断することです。あなたはこれを試しましたか?あなたは何を見つけましたか? –
私はすでにそれをしました。 Entity Frameworkの代わりにLinqToSqlを使用して同じクエリを作成すると、結果が同じでなく、クエリがより速く(約30秒)、Entity Frameworkによって構築されている不要なサブクエリにあると思います。上記の例でSqlが表示されている場合、テーブルへの不要なサブクエリがあり、row_numberはテーブルに適用されず、そのサブクエリの結果に適用されます。 – Boanerge
それは実際に私の質問に答えるものではありません。あなたが責任を負うサブクエリは、完了するのに165秒かかるEFクエリの多くに現れます。 SQLプロファイラは、より具体的な情報を提供する必要があります。正確に何が165を引き起こしていますか? –