2016-08-16 2 views
0

데이터베이스에 날짜 필드 (VisitDate)가있는 테이블이 있습니다. 나는 다음과 같은 SQL 쿼리를 실행하면, 내가 일초의 결과가 나타납니다 (Visual Basic의 경우) 내 ASP.Net 코드,GroupBy() 매우 느리게 실행 중

select year(VisitDate), month(visitDate) 
from GABrowser 
group by year(VisitDate), month(visitDate) 

그러나, 추적이 실행 12 초 정도 걸립니다 :

Dim stats = db.GABrowsers.GroupBy(Function(s) New With {s.VisitDate.Value.Year, s.VisitDate.Value.Month}) 

'(Takes 12 seconds to enter in the For loop) 
For Each stat In stats 

Next 

나는 왜 그렇게 오래 걸릴지 모르겠다. 그것은 내 웹 페이지가 매우 느리게로드되게합니다.

+0

SQL Server가 실제로 무엇을하고 있는지 확인해야합니다. 귀하의 응용 프로그램이 SQL Server로 보내는 명령을보기 위해 SQL 프로파일 러를 실행할 수 있습니까? 그렇다면 실행 시간과 지속 시간을 확인할 수 있습니다. –

+0

VisitDate 용 클러스터 인덱스를 만들고 EF 프로파일 러를 사용하여 SQL 쿼리를 게시하십시오. –

+0

SQL 프로파일 러에 대해 들어 본 적이 없습니다. 이걸 어디에서 만듭니 까? – AskYous

답변

3

SQL 쿼리와 LINQ 쿼리가 동일하지 않습니다.

SQL 쿼리는 year(VisitDate)month(visitDate) 만 반환합니다. 그러나 LINQ의 GroupBy은 다르지만 그룹화 조건에 따라 그룹화 된 전체 엔터티을 반환합니다.

LINQ 결과에서 그룹 은 s.VisitDate.Value.Years.VisitDate.Value.Month의 그룹으로 표시됩니다. LINQ 문에 의해 생성 된 SQL 쿼리가 첫 번째 SQL 쿼리보다 훨씬 더 넓다는 것을 알 수 있습니다.

게다가 (더 큰 SQL 결과 세트) EF가 데이터베이스의 데이터를 처리하고 엔티티 오브젝트를 구체화하는 데는 시간이 걸립니다.

+1

동등한 LINQ 쿼리를 게시하면 유용 할 것입니다. – Enigmativity

+1

쿼리 마지막에'.Select (Function (g) g.Key)'를 추가하십시오. –

+0

@IvanStoev OP가 LINQ 문과 동일한 결과를 실제로 원하는지 또는 SQL 문을 동등하다고 가정 *했는지 여부는 확실하지 않습니다. 'For' 루프에서 무슨 일이 일어나는지 보는 것은 흥미로울 것입니다. 물론, SQL 결과를 재현하려면 'Key'를 선택하면된다. –

관련 문제