2017-09-14 1 views
-1

나는 C# 엔티티 프레임 워크를 사용하고 방법은 학생들Include가 Count의 성능에 영향을 줍니까?

public static int GetStudentCount() 
{ 
    using(SchoolContext ctx = new SchoolContext()) 
    { 
     return ctx.Student.Include("Subjects").Include("Subjects.SubjectsDescription").Include("Teacher").Count(); 
    } 
} 

질문 계산하기 위해 다음과 같습니다 이 방법으로 성능 차이가 있습니까?

public static int GetStudentCount() 
{ 
    using(SchoolContext ctx = new SchoolContext()) 
    { 
     return ctx.Student.Count(); 
    } 
} 

업데이트 : 전혀 Include()을 추가하는 이유는 일부 사용자가 관심 때문에 - 나는 Serval의 필터를 사용하는 방법을 다시 사용하려는. 그래서 얻을 수있는 하나 개의 방법이있는 모든 학생들 GetStudent

public static int GetStudentCount(Filter f) 
{ 
    using(SchoolContext ctx = new SchoolContext()) 
    { 
     return GetStudents(ctx.Student.AsQueryable(),f).Count(); // has filters an Include() 
    } 
} 
+1

테스트하고 확인하십시오. –

+0

@GiladGreen SQL에 캐싱이 있고 차이가 있음을 알 수있는 충분한 데이터가 없기 때문에 테스트하기가 어렵습니다. – Toshi

+1

@Toshi - 영향력에 대한 대답은 "예"입니다. 포함을 추가하면 조인이 생성됩니다. 하지만 올바른 일은 단지 테스트 일뿐입니다. 데이터로 채우고 많은 시간 동안 쿼리를 실행하고 평균을 수행하는 것입니다 (또는 가능한 경우 캐싱없이 DB 속성을 사용하여 재생). –

답변

2

내가 아래의 코드와 로그를 실행의 차이를 테스트하기 위해 데이터를 필터링하고 단지 (데이터베이스 페이징) 카운트를 반환하는 동일한 코드를 사용하는 하나의 방법 내 oracle 데이터베이스에 대한 생성 쿼리.

var context = new DbContext(); 
context.Database.Log = Log; 
var count = context.TBCO_CATEGORY.Count(); 

는 생성 쿼리

SELECT 
"GroupBy1"."A1" AS "C1" 
FROM (SELECT 
    COUNT(1) AS "A1" 
    FROM "SIMS"."TBCO_CATEGORY" "Extent1" 
) "GroupBy1" 

후 나는 다음과 같은 코드를 실행했다

var context = new SIMSContext(); 
context.Database.Log = Log; 
var count = context.TBCO_CATEGORY.Include(x=>x.TBCO_ITEM).Count(); 

생성] SQL이었다 :

그래서 같은 동일한 SQL 문을 의미
SELECT 
"GroupBy1"."A1" AS "C1" 
FROM (SELECT 
    COUNT(1) AS "A1" 
    FROM "SIMS"."TBCO_CATEGORY" "Extent1" 
) "GroupBy1" 

실행 계획.

관련 문제