일대 다 매핑이 ​​많은 쿼리의 성능 향상

dapper entity-framework petapoco sql-server

문제

엔티티 프레임 워크를 SQL Azure에 사용하고 있습니다. 응용 프로그램의 한 페이지에서 사용자에게 관련 데이터를 보여줍니다. 페이지에 최대 30 개의 항목을로드하지만 각 항목에는 다른 개체에 5 개의 일대 다 매핑이 ​​있습니다. 쿼리 시간은 합리적인 수준이지만 객체 매핑에 상당한 성능이 새어 나옵니다. (거의 1 초).

내 객체가 어떻게 생겼는지 보여주는 예가 있습니다.

var Items = context.Items.Include(x=>x.Data).Include(x=>x.Files).Include(x=>x.Comments).Include(x=>x.People).Where(some constraint).ToList();

작업에는 이름, 상태 및 기한이 있습니다. 그것은 또한 TaskData, 많은 파일, 많은 의견과 그것에 대해 많은 사람들이 작업의 역사를 보여주는 커스텀 이름 / 값 쌍, 많은 트랜잭션 인 많은 TaskData를 가지고 있습니다.

내 EF 쿼리는 다음과 같습니다.

var Items = context.Items.Include(x=>x.Data).Include(x=>x.Files).Include(x=>x.Comments).Include(x=>x.People).Where(some constraint).ToList();

특정 작업의 관련성은 먼저 상태 및 마감일을 기준으로합니다. 그래서 나는 sort와 함께 사용할 IComparable override를 만들었습니다. 요점은 정렬이 int 또는 날짜를 기반으로하지 않기 때문에 페이징 된 쿼리가이 시나리오에서 제대로 작동하지 않는다는 것입니다 (맞습니까?).

나머지 응용 프로그램에서는 각 작업에 대한 정보가 거의 표시되지 않고 Linq2Entities가 정상적으로 작동하고 있습니다. 이 경우 객체 매핑은 우리를 죽이고 있습니다. Dapper를 사용하여 DB로 곧바로가는 길을 따라 갔지만 일대 다 매핑은주의해야합니다. 약간 관계를 위해 나는 잘 작동 할텐데 그러나 5-6을 위해 아닙니다 생각한다. 내가보기에는 페타 포코 (PetaPoco)가 있었지만 먼저 여기에 질문을 던질 것을 생각하기에 아직 멀었다.

너무 많은 데이터를 다시 가져 오는 데 미친 점이 있습니까? 이 중에서 최대의 성과를 얻기위한 나의 선택은 무엇입니까? 응용 프로그램의 유일한 영역 이후로 약간의 복잡성을 취할 것입니다.

수락 된 답변

귀하의 EF 쿼리가 너무 많은 데이터를 가져오고 있습니다. 문제는 "최적의"검색 기술은 가져 오는 데이터의 유형과 양에 크게 의존한다는 것입니다.

앞을 알면 예상 한 데이터 세트를 기반으로 실행하는 쿼리를 조정할 수 있습니다.

예를 들어 ... 많은 하위 객체가있는 제한된 수의 엔티티 만 당기는 경우 여기에서 작성한 패턴이 잘 작동합니다.

Dapper를 사용하여 중첩 된 객체의 목록을 매핑하는 방법

어떤 ID를 QueryMultiple 2000보다 적은 수를 알고 있다면 QueryMultiple 사용하여 단일 그리드와 매핑을 쿼리하여 바로 가기를 수행 할 수 있습니다.

cnn.QueryMultiple(@"select * from Tasks where Id in @ids 
select * from Files where TaskId in @ids
.. etc ..", new {ids = new int[] {1,2,3}});

더 큰 세트를 잡아 당기고 싶다면 일괄 처리하거나 단계적으로해야 할 수도 있습니다.


예를 들어 Tasks 를 쿼리하여 모든 작업 ID와 데이터를 가져온 다음 단일 QueryMultiple 을 사용하여 관계를 모든 관련 테이블에 QueryMultiple 합니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.