2010-01-08 1 views
0
IQueryable<WebEvent> mySearch = 
    eventDC.GetBooks() 
     .Where(p => p.Price.Any(d => d.EventDatetime.Month == fromDate.Month 
            && d.EventDatetime.Year == fromDate.Year)) 
     .WithGroup(groupId) 
     .OrderBy(p => p.Price.Where(r => r.Datetime >= fromDate) 
          .OrderBy(q => q.Datetime) 
          .FirstOrDefault().Datetime); 
List<Book>ventsList = mySearch.ToList<Book>(); 

우리는 그러한 긴 쿼리를 가지고 있으며, 테스트를 마친 후에 책을 읽고 정렬하는데 많은 시간을 소비합니다.이 쿼리를 포함하는 페이지에 대한 응답 시간이 10 초를 초과했으며, 응답 시간을 줄일 수 있습니다.응답 시간을 줄이기 위해 어떻게이 linq를 엔터티 쿼리에 최적화 할 수 있습니까?

누구에게 의견이 있습니까?

+3

우리는 스크롤 할 필요가 없기 때문에 * 가독성 *을 최적화 할 수 있습니다. 시작점으로 ... 생성 된 SQL 및 이상적인 쿼리 실행 계획과 병목 현상을 어떤 형태로 게시하는 것이 좋습니다. –

+0

linq를 엔티티에 사용하면 생성 된 SQL을 어떻게 얻을 수 있습니까? – MemoryLeak

+0

'ObjectQuery.ToTraceString()'또는 SQL 프로필러. LINQPad도 여기에 도움이됩니다. –

답변

0

일반적으로 SQL을 검사하여 그 결과를 확인하고 인라인 할 수 있습니다. LinqPad라고하는 도구를 사용하면 LINQ 쿼리를 만들고 LINQ 쿼리를 조정할 수 있습니다. 또한 인덱스를 추가 할 위치를 찾고; 이렇게하면 성능이 향상 될 수 있습니다 (너무 많은 인덱스가 성능에 영향을 미칠 수 있으므로 조심해야합니다).

1

정확히 무엇을하려고합니까? 여기에 스키마에 대한 아이디어를 줄 수 있습니까?

내가 스키마 모르는 때문에 이것은 나에게 이상한 문처럼 보인다 :

P => p.Price.Any (D => d.EventDatetime.Month ...

그러나, 여기 어둠 속에서 총을 쏘면거야 당신이에 문제가있을 수 있다고 :

eventDC.GetBooks()

을 그 방법은 데이터베이스에 "책 SELECT * FROM"않습니다, 그렇지 않으면 저장 프로 시저를 호출하는 경우, 또는

, 다음, 당신이 실제로하고있는 것은 다음 복용 DB

  • 에서 모든 책을 선택

    1. 결과 목록 및 원하는 책만 선택하십시오.

    이 경우 가장 큰 문제 일 수 있습니다.

  • +0

    정확히 내가 말하려고했던 것. @MemoryLeak 테스트하려면 코드 줄을 나누어서 가장 긴 시간이 걸리는 것으로 판단하십시오. 'p.Price.Any ('선택은 나를 혼란스럽게합니다. – Codesleuth