2010-01-11 5 views
2

LINQ-to-SQL을 사용하여 SELECT TOP 5와 동일한 성능을 수행하는 방법을 살펴본 결과 모든 대답은 .Take()를 사용하는 것이 좋습니다 그래서 :"SELECT TOP {x}"쿼리를 사용하여 LINQ to SQL 성능

var myObject = (
from myObjects in repository.GetAllMyObjects() 
select myObject) 
.Take(10); 

아직 LINQ는 뒤의 장면을 어떻게 작동하는지하지만 C와 같은 언어에 대한 이해에 가장이가 먼저 모든 레코드를 포함하는 임시 배열을 할당 복사에 의해 해결하는 것이 이해가 안 돼요 배열의 처음 10 개 요소를 var. 작은 데이터 셋이나 성능 제약이 없다면 그런 문제는 아니지만, 예를 들어, 수백만 개의 레코드를 포함 할 수있는 테이블에서 가장 최근의 5 개의 로그 항목을 선택하는 경우 나에게 비효율적 인 것처럼 보입니다.

이것이 어떻게 잘못 됐는지를 이해하고 있습니까? 그렇다면 누군가 실제로 일어난 일을 설명 할 수 있습니까? 그렇지 않으면 LINQ-to-SQL을 통해 x 레코드를 선택하는 것보다 (즉, 더 효율적인) 더 나은 방법은 무엇입니까?

[편집]

내가 허용 대답의 제안에 따라 디버그 출력에 LINQ - 투 - SQL 출력을 보내는 가상 즉, myObject 클래스가 있습니다. 나는 여기에서 DebuggerWriter를 사용하여 끝냈다 : http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11

+2

디버거에서 Linq 개체를 검사하면 실행할 SQL 쿼리가 표시됩니다. 어쩌면이게 도움이 될까요? –

답변

3

귀하의 가정은 틀린 것입니다. Linq to SQL을 사용하면 평가할 수 있고 적절한 SQL을 생성 할 수있는 Expression<Func<...>>으로 평가됩니다. 모든 레코드를로드하는 것에 대해 걱정할 필요가 없습니다.

또한 다음 질문을 참조하십시오. DataContext에 스트림을 첨부하고 생성 된 SQL을 볼 수 있습니다. How to get the TSQL Query from LINQ DataContext.SubmitChanges()

+0

데이터 컨텍스트 출력 로깅은 멋진 팁입니다! – nathanchere

1

LINQ는 지연된 실행과 LINQ-to-SQL 식 트리를 사용합니다.

Take 호출 결과를 열거 할 때까지 쿼리가 실행되지 않으므로 걱정할 필요가 없습니다.

1

나는 지난 주에 방금 나갔다. 내 dev 데이터베이스에 SQL 프로파일 러를 열고 코드를 밟았다. 다양한 쿼리에 대해 생성 된 SQL을 보는 것은 매우 흥미 롭습니다. 나는 당신이 똑같이하는 것이 좋습니다. 귀하의 질문에 대한 정확한 답변이 아닐 수도 있지만 귀하의 다양한 구성 요소가 통화의 내용에 따라 완전히 다른 SQL 문을 생성하는 방법을 확인하는 것은 확실합니다.

MSDN에서 "지연 쿼리 해결"또는 뭔가 (?)를 읽는 것이 계몽 적이라고 생각합니다.

+2

SQL Express 데이터베이스를 사용하고 있습니다. 지금까지 알고있는 SQL 프로파일 러가 없습니다. ( – nathanchere