내 데이터 액세스 계층에서 Entity Framework 5, ObjectContext 및 POCO를 사용하고 있습니다. 일반 저장소 구현이 있고 Skip() 및 Take()를 사용하여 페이징 데이터베이스를 쿼리하는 메서드가 있습니다.Entity Framework 매우 느리게 실행되는 메서드 건너 뛰기
C# 코드 : 모든 행의 많은 (I 약 170K 행을 말하는거야)이 엔티티에 Linq에 내 쿼리의 발췌
인을 건너 뛰는 경우 쿼리 성능이 매우 느립니다 것을 제외하고 잘 작동 : 번역 된 쿼리에
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);
은은 Transact-SQL을하는 나는 발견 그 대신 ROW_NUMBER() 뷰가 직접이 하위 쿼리를 제작하고 ROW_NUMBER 적용과 절()를 사용하여 서브 쿼리의 결과 ...에
예 :
이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를 일으키는 것은 무엇입니까? –