2013-06-04 2 views
0

우리는 우리의 응용 프로그램에서 데이터 끌어 오기 중 하나를 사용하여 성능 악몽을 겪었습니다. 상황이 발생하는 것은 고객의 대규모 목록이있는 지역 기반 쿼리의 경우이며 고객이 볼 때 해당 지역의 고객 만 볼 수 있어야합니다. 현재 테이블 (설명의 편의를 위해 다운 컷) :엔티티 프레임 워크 데이터 최적화 일대 다

Customer (Table): 
CustomerID 
FirstName 
LastName 
.... 

RegionCustomer (Table): 
RegionCustomerID 
RegionID 
CustomerID 

이 (한 고객이 많은 RegionCustomer을 가질 수 많은 관계로 하나를 설정 edmx) 다음 문을 사용하여 .NET 엔티티 프레임 워크를 통해 검색보다 : 당신이 있지만,이 SQL 서버 충격은 CPU 뭔가를 회전 긴하는 데 걸리는 성능 악몽 그 이후에 테이블에 < 1000 개의 레코드를 처리 할 때이 확인을 실행

EntitiesManager.Customers.Where(function(x) x.RegionCustomers.Any(function(y) y.RegionID = CurrentUserRegionID)).ToList() 

. 위의 명령문이 생성하는 SQL은 (SQL 프로파일 러를 통해 추적 할 필요가있는) 꽤 불쾌합니다.

누군가가 어떻게 속도를 높일 수 있는지 궁금한가요? 사전에

감사

그것은 RegionCustomers 시작하는 데 도움이됩니다

답변

0

: 나는 비주얼 베이직 구문을 사용하고 있지 않다

EntitiesManager.RegionCustomers.Where(function(regionCustomer) regionCustomer.RegionID = CurrentUserRegionID).SelectMany(function(regionCustomer) regionCustomer.Customers).ToList() 

,하지만 그건 잘못된 경우, C#으로는 다음과 같습니다

EntitiesManager.RegionCustomers.Where(regionCustomer => regionCustomer.RegionID == CurrentUserRegionID).SelectMany(regionCustomer => regionCustomer.Customers).ToList(); 

나는 SQL이 다음과 같은 라인이 될 것이라고 생각한다.

SELECT * FROM Customer WHERE CustomerID IN (SELECT CustomerID FROM RegionCustomer WHERE RegionID = {0}) 

skip(). take()를 사용하여 페이징을 고려하고 CustomerId에 Customer와 외래 키 관계가있는 경우 RegionCustomer 테이블을 최적화하는 것이 좋습니다. 꽤 빠른 쿼리 여야합니다.

또한 Execution Plan을 확인하여 SQL Server에 대한 제안 사항이 있는지 확인하십시오.

행운을 빈다.

+0

안녕 Dan, 귀하의 회신에 감사드립니다. SelectMany는이 관계에서 나를 위해 작동하지 않을 것입니다. 그것은 올바른 데이터 (EntitiesManager.RegionCustomers.Where (function (regionCustomer) regionCustomer.RegionID = CurrentUserRegionID) .Select (function (regionCustomer) regionCustomer.Customers) .ToList())를 반환 한 바로 선택을 허용 할뿐입니다. 원래 방법보다 실제로 느린가? – Matt

+0

SelectMany에 관심이 없다. 그게 VB 물건 또는 무엇인지 궁금합니다 ... –

+0

이것이 당신의 문제라면 내 대답을 업데이 트하지만 거기에 그냥 많은 - 투 - 많은 관계로 매핑하지 않는 이유가 무엇입니까 ? 당신이 정말로하고 싶은 것이 EntitiesManager.Customers.Where의 라인을 따라있는 것처럼 보입니다. (function (customer) customer.Regions.Any (function (region) region.RegionID = CurrentUserRegionID) .ToList() –

관련 문제