2012-12-18 3 views
5

나는 어디 상위 10에만 .Take() 사용하여지고 오전 200000 레코드 테이블이 있지만 약 10 초 데이터를 가져 오는 것입니다.엔티티에 Linq 매우 .Take() 메서드를 사용하여 느리다

내 질문은 : .Take() 메서드는 데이터베이스의 모든 데이터를 가져 와서 클라이언트 측에서 상위 10 개 필터를 사용합니까?

mylist = (from mytable in db.spdata().OrderByDescending(f => f.Weight) 
            group feed by mytable.id into g 
            select g.FirstOrDefault()).Take(10).ToList(); 

spdata()는 저장 프로 시저에서 함수 가져 오기입니다 :

여기 내 코드입니다.

감사

+7

당신은 프로파일 러 후크해야하는지는 데이터베이스에 대해 실행 궁금하다면 귀하의 DB 및 로그를 확인하는 것이 가장 좋은 방법입니다. – Chris

+1

spdata()가 200,000을 반환하면 yes를 클라이언트 측에서 처리합니다. –

+0

Chris의 방법 외에도 Linqpad를 사용해보고 생성 된 SQL을보기 위해 쿼리를 작성한 후 SQL보기로 전환하거나 중단 점을 넣을 수 있습니다 (이 방법으로 http://stackoverflow.com/questions/1412863/how -do-i-view-the-entity-by-the-entity-framework)를 사용하여 프로그램이 실행될 때 생성되는 내용을 확인할 수 있습니다. –

답변

8

저장 프로 시저는 클라이언트에 많은 데이터를 매우 느리게 반환합니다. 당신은 sproc에 대한 질의를 원격으로 할 수 없습니다. 그것은 뷰 또는 테이블 반환 함수를 사용하여 가능합니다.

검색어에 sproc을 사용할 방법이 없습니다. 당신은 스스로 그것을 실행할 수 있습니다.

아마도 서버에서 Take(10)을 실행하려고했을 것입니다. 이 기능을 사용하려면 인라인 쿼리,보기 또는 TVF로 전환해야합니다.

6

데이터베이스에서 모든 결과를 가져 오지 않습니다 Take 확장 방법. 그건 Take의 작동 방식이 아닙니다.

그러나 db.spdata() 호출은 모든 행을 페치합니다.

1

나는 100 % 확실하지 않다하지만 난 ... 당신이 EF의 DataContext를 사용하여 SP를 호출 할 때를 IEnumerable 결과를 얻을 기억으로

는 성능을 최적화 할 수 있었다 몇 있습니다

  • 검색 기준을 SP 매개 변수로 전달하고 저장 프로 시저에서 필터링을 수행하십시오.

또는 당신은 당신이 어떤 변수를 선언하지 않으며 어디 그냥 다음 몇 가지 테이블을 조인하는 SP의 매우 간단한 쿼리가있는 경우 : 조회를 지정하는 곳

  • 는 인덱싱 된 뷰를 만들기를 당신을 필요에 따라 Take 메서드를 호출하십시오.
    무엇이 당신을 줄 것인가? 만든 뷰에 매핑 할 수 있으며 EF는 IEnumerable이 아닌 IQueryable 결과를 반환합니다. 이렇게하면 sql 명령이 최적화되고 모든 데이터가 수신되고 필요한 10 가지 요소 만 가져오고 10 개의 요소 만 검색하는 sql 명령이 만들어집니다.

또한 IEnumerable과 IQueryable의 차이점을 확인하는 것이 좋습니다.

0

그룹화하기 전에 데이터를 정렬하기 때문에 SQL에서는 할 수 없습니다.

당신은 얻을 분류 한 후, 각 그룹에서 가장 높은 무게를 얻기 위해 가중치를 집계을 사용해야합니다

열 최대 :

mylist = (
    from mytable in db.spdata() 
    group feed by mytable.id into g 
    select g.Max(f => f.Weight) 
).OrderByDescending(w => w).Take(10).ToList(); 
+0

오류 "오류가 발생했습니다." 'g'라는 로컬 변수는 이미 '부모 또는 현재'범위에 사용되어 'g'와 다른 의미를 부여하기 때문에이 범위에서 선언 할 수 없습니다. " –

+0

@AliIssa : 맞습니다. 거기에는 다른 변수가 있어야합니다. 나는 그것을 바꿨다. – Guffa

관련 문제