2013-05-06 3 views
7

내 데이터 액세스 계층에서 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 초 정도 걸립니다. 번역 된 쿼리 문의 성능을 향상시키는 방법에 대한 아이디어가 있습니까?

+2

쿼리가 빠르기 때문에 건너 뛰기가 없기 때문에 문제는 Entity Framework의 다른 성능 고려 사항이 아닌 SQL에 있음을 나타냅니다. 따라서 가장 먼저 SQL 프로필러를 사용하여 쿼리가 느린 이유를 진단합니다. 이거 해봤 니? 뭘 찾았 니? –

+0

나는 이미 그렇게했다. 나는 Entity Framework 대신 LinqToSql을 사용하여 동일한 쿼리를 만들 때 결과가 동일하지 않으며 쿼리가 훨씬 빠릅니다 (~ 30 초). 문제가 Entity Framework에 의해 생성되는 불필요한 하위 쿼리에 있다고 생각합니다. 위 예제에서 Sql이 표시되면 테이블에 불필요한 하위 쿼리가 있고 row_number가 테이블에 적용되지 않고 해당 하위 쿼리의 결과에 적용됩니다. – Boanerge

+0

사실 내 질문에는 대답하지 않습니다. 당신이 비난 한 하위 쿼리는 완료하기 위해 165 초가 걸리는 많은 EF 쿼리에 나타납니다. SQL 프로파일 러는보다 구체적인 정보를 제공해야합니다. 정확하게 165를 일으키는 것은 무엇입니까? –

답변

0

속도가 느린 이유 중 하나는 SQL에서 행을 두 번 정렬하는 것입니다.

쿼리를 제어하기 위해 내가 아는 유일한 옵션은 idPred.SqlQuery ("Select ...", params)를 호출하는 것입니다. 이렇게하면 데이터 요청에 대해 자신 만의 최적화 된 쿼리를 작성할 수 있습니다.

+2

당신이 나를 투표 할 예정이라면, 제 대답에 무엇이 잘못된지 알려주시겠습니까? –

1

위의 설명을 따르지 않은 사람들은 SELECT이 165s를 실행하지 않는 많은 EF 쿼리에 존재하기 때문에이 문제가 추가 SELECT이 아닌 것으로 의심됩니다. 나는 결국 ObjectSet이 VIEW을 참조하고 문제의 일부인지 궁금해했다. 실험을 마친 후 문제를 좁혀보기 내에서 LEFT JOIN으로 좁혔습니다. 나는 그 쿼리에 대해 데이터베이스 튜닝 어드바이저를 운영 할 것을 제안했다. 그는 그렇게했고, 두 지수는 문제를 해결할 것을 제안했다.

관련 문제