최근 엔 Entity Framework에서 SQL Server 2008에 대해 쿼리하는 성능 문제가 발생했습니다. 문제를 해결할 수 있었지만 문제가 해결 된 이유를 알 수 없습니다. 나는 SQL에서 IN 절을 생성하기 위해 .Contains() 메소드와 함께 Guids 콜렉션을 사용하고있다. 여기에 원래 코드는 (테이블 이름이 무죄를 보호하기 위해 변경)입니다 :Entity Framework 동일한 결과를 갖는 두 개의 쿼리가 더 빠릅니다.
Guid[] values = filter.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();
returnValue = returnValue.Where(t => values.Contains(t.WorkItem.Requirement.Project.ProjectId));
이 쿼리는 150 ProjectID 년대가>있을 때 실행을 위해 ~ 20 초 소요됩니다. .Contains()의 위치를 변경함으로써 나는 것들을 극적으로 빠르게 할 수있다. 다음은 리팩터입니다.
Guid[] values = filter.FilterValue.Split(',').Select<String, Guid>(d => new Guid(d)).ToArray();
var projects = from p in context.DC_DEF_Project
where values.Contains(p.ProjectId)
select p;
returnValue = from t in returnValue
join p in projects on t.DC_DEF_ProjectWorkItem.DC_DEF_ProjectRequirement.ProjectId equals p.ProjectId
select t;
이 코드는 위 쿼리와 동일한 데이터 세트에서 ~ 0.125 초가 소요됩니다.
확실한 이유가 있지만 내 호기심이 나를 죽이고 있습니다. 이게 뭐야?
각 코드가 생성하는 sql은 무엇입니까? LOok을 읽고 differnces를보고 각각에 대한 실행 계획을보고 왜 다른 하나보다 느린 지 확인하십시오. – HLGEM
프로파일 링 세션을 수행하고 두 쿼리에서 생성 된 실제 SQL을 비교하는 것이 좋습니다. –
returnValue의 선언과 초기화를 보여줄 수 있습니까? 그 유형은 무엇입니까? – Odrade