2009-04-28 2 views
0

다음 (줄이기) 코드 발췌문은 이 손으로 만들어진 쿼리보다 느린 SQL (ToTraceString을 통해)을 생성하는 Linq-To-Entities 쿼리입니다. 나는 어리석은 짓을하고 있는가? 아니면 Linq-to-Entities가 질의를 최적화하는데 나쁜가?왜 LINQ-to-Entities에서 생성 된 SQL이 비효율적입니까?

XML 데이터 구조 (다른 모든 고통)를 작성하기 전에이를 실행해야하므로 쿼리 끝에 ToList()가 있습니다.

var result = (from mainEntity in entities.Main 
       where (mainEntity.Date >= today) && (mainEntity.Date <= tomorrow) && (!mainEntity.IsEnabled) 
       select new 
       { 
        Id = mainEntity.Id, 
        Sub = 
         from subEntity in mainEntity.Sub 
         select 
         { 
          Id = subEntity.Id, 
          FirstResults = 
           from firstResultEntity in subEntity.FirstResult 
           select new 
           { 
            Value = firstResultEntity.Value, 
           }, 
          SecondResults = 
           from secondResultEntity in subEntity.SecondResult 
           select 
           { 
            Value = secondResultEntity.Value, 
           }, 
          SubSub = 
           from subSubEntity in entities.SubSub 
           where (subEntity.Id == subSubEntity.MainId) && (subEntity.Id == subSubEntity.SubId) 
           select 
            new 
            { 
             Name = (from name in entities.Name 
               where subSubEntity.NameId == name.Id 
               select name.Name).FirstOrDefault() 
            } 
          } 
       }).ToList(); 

나는이 작업을 수행하면서 날짜에도 몇 가지 실질적인 문제가 있습니다. 내 데이터 구조에 반환 된 날짜를 넣으려고 할 때 "1005"라는 내부 오류가 발생했습니다.

답변

7

Linq-To-Entities (아직)에 대한 실제 경험을 기반으로하지 않는 일반적인 관찰과 마찬가지로 : 하나의 쿼리 내에 4 개의 중첩 된 하위 쿼리가있는 것은 처음부터 매우 효율적이고 신속한 것처럼 보이지 않습니다.

Linq-to-Entities에서 생성 된 SQL의 (부족한) 품질에 대한 귀하의 매우 광범위한 진술은 보증 할 수 없다고 생각합니다. 그리고 많은 증거로 그 사실을 뒷받침하지 않습니다.

Rico Mariani (MS 성능 전문가) 및 Julie Lerman ("프로그래밍 EF"의 저자)을 비롯한 여러 유명 인사가 다양한 테스트에서 일반 및 전반적으로 Linq-SQL 및 Linq-to-Entities를 " 엔진 "이 실제로 그렇게 나쁘지는 않습니다 - 가능한 최고 성능의 전반적으로 최소 80-95 %를 달성합니다. 모든 .NET 응용 프로그램 개발자가이를 달성 할 수있는 것은 아닙니다 :-)

해당 쿼리를 다시 작성하거나 내용을 구성하는 비트와 조각을 검색하는 방법을 변경할 수있는 방법이 있습니까?

마크

+0

LINQ-to-Entities (예 : 조인 대신)에서 중첩 된 하위 쿼리 *를 권장하지 않습니까? http://blogs.msdn.com/esql/archive/2007/11/01/EntitySQL_5F00_Tip_5F00_1.aspx를 참조하십시오. – dommer

0

.ToList()를 호출하여 결과를 즉시 구현하지 않으셨습니까? 당신은 거대한 하나의 헤어지는 시도해 볼 수도 있습니다 ... 또한

foreach(var r in result) 
{ 
    // build your XML 
} 

나는 그것이 차이를 만들 것입니다 모르겠지만, 당신이 .ToList()를 호출하는 대신 결과를 반복하는 경우는 성능 향상을 볼 수 있습니다 별도의 쿼리로 쿼리 한 다음 결과를 반복합니다. 하나의 큰 꿀꺽 꿀꺽 마시는 모든 것을 보내는 것이 문제 일 수 있습니다.

관련 문제