2015-01-14 2 views
2

면책 조항 : 모든 답변을 another question에서 찾지 못했습니다.DbQuery 대 IQueryable SQL 성능

LINQPad에서 쿼리를 준비하는 동안 일부 결과는 IQueryable으로 반환되고 일부는 DbSet으로 반환됩니다.

쿼리의 모든 버전

는 여기에서 찾을 수 있습니다 : 된 IQueryable에 관해서는 171

어디 https://dotnetfiddle.net/r1ghBv

// returns IQueryable<Message> 
// Time : 133 ms 
from m in Messages 
    where m.MessageStatusId < 5 && ( 
     from mm in Messages 
     where mm.MessageStatusId < 5 
     group mm by mm.F_Id into g 
     select g.Key 
    ).Contains(m.F_Id) 
    select m 

대 LINQPad에서

// returns DbQuery<Message> 
// Time : 112 ms 
from mm in Messages 
where mm.MessageStatusId < 5 
group mm by mm.F_Id into g 
from m in g 
select m 

을 DbQuery 버전은 IL의 89 개 라인을했다

DbQuery는 클래스 대 IQueryable 인터페이스이며 DbQuery에는 더 많은 메서드가있는 것 같습니다. 그러나 C# .NET 4.5.2 및 Entity Framework 6.x에서 다음 쿼리를 사용하면 어떤 SQL 성능이 더 좋을지 알고 싶습니다.

질문 : 위의

  1. 어떻게 반환 형식은 쿼리에서 결정있어 무엇입니까?
  2. DbQuery 버전에는 실제 쿼리 이전에 LINQPad의 SQL 탭에 7 개의 추가 SQL 쿼리가 있었는데, IQueryable 버전 LINQPad에서 간단히 쿼리를 생성했는데 DbQuery가 조금 더 빨랐습니다. Eb 라이브러리 클래스 인 DbQuery 때문입니까?
+0

Linqpad에서 유사한 쿼리를 실행 해봤지만 IOrderedQueryable <>을 쿼리 유형으로 사용했습니다. linqpad에서 작성한 내용을 쉽게 공유 할 수 있습니까? –

+0

LINQPad에서 EF 모델의 dll을 참조했습니다. https://dotnetfiddle.net/r1ghBv에서보고있는 쿼리는 4 개의 개별 LINQPad 탭에서 얻은 것입니다. @RaduPascal에 대한 질문에 대답 했습니까? – ablaze

답변

0

반환 유형은 Message 유형의 한 행과 같습니다. 2 개의 질의 간의 시간차는 질의의 2 번째 'from'에서 설명 할 수 있습니다. 첫 번째 쿼리에서는 N x N을 통해 열거하고 두 번째 쿼리는 N x M을 통해 열거합니다. M은 두 번째 'from'입니다. 두 번째 쿼리에서 'g'는 모든 메시지의 하위 집합입니다.

+0

내가 말하는 것을 지원하지만 나 혼란 스럽다. (위에서 말했듯이 ...) LINQPad의 첫 번째 LINQ 쿼리는 단 하나의 실제 SQL 쿼리 만 표시하고 SQL 탭에 IQueryable 을 반환합니다. LINQPad에서 두 번째 LINQ 쿼리를 실행하면 INFORMATION_SCHEMA.TABLES, [app]에 몇 가지 (7 개의) SQL 쿼리가 표시됩니다. [__ MigrationHistory] (app는 내 스키마 임), [dbo]. [EdmMetadata] sys.databases의 IF SQL 문으로 시작 ... LINQPad의 SQL 탭에서 DbQuery를 반환합니다. 그럼에도 불구하고 조금 더 빠르게 실행되는 두 번째 LINQ 쿼리를 관찰했습니다. 나는 좀 더 정확한/늠름한 성능 분석을 환영한다. – ablaze