2014-04-20 5 views
1

해결 방법을 찾았을 때 실제 질문보다 명확한 질문이 더 많습니다. 난 그냥 SQLite는 그물이sqlite-net의 FirstOrDefault()와 Where() 사이의 의미 차이

2.1 나는 .FirstOrDefault(lambda)을 실행에 .Where(lambda).FirstOrDefault()를 실행 사이에 뚜렷한 차이를 볼 사용 SQLLite 3.8.3.1을 사용하여 ...

추론을 이해하지 않습니다.

Linq에 대한 제 경험으로 보면 데이터베이스 LINQ 제공자는 본질적으로 동일한 두 가지를 모두 처리합니다 (.FirstOrDefault(lambda)). 적절하게 최적화 된 경우 조금 더 빠르지 만,이 두 호출은 대략 동일한 시간이 걸릴 것입니다 실행).

그러나, SQLite는-NET에서, 나는 그것에 ~ 40,000 레코드가 테이블에 다음과 같은 결과를보고하고있다 :

.FirstOrDefault(x => x.Id == id)를 실행, 나는 코어-I7에 복용 시간을보고하고하는 것은 사이에 2200ms ~ 3700ms. 표면 RT (1 세대)에이 사실

.Where(x => x.Id == id).FirstOrDefault()를 실행, 나는 16ms - 20ms의 사이 동일한 코어-I7에 복용 시간을보고 있어요 .. 주위에 소요-30,000ms을 20,000ms. 표면 RT에서 이것은 약 30ms가 걸립니다.

내 질문은 이것이 버그인지 또는 의식적인 디자인 결정인지 여부입니다. 디자인 결정이라면 그 배후에있는 추론을 이해하고 싶습니다.

+3

두 가지 방법 간에는 의미상의 차이가 없으므로 단순한 쿼리로 인해 100-1000 배의 시간이 소요될 수 있습니다. 그러나 더 많은 정보가 없으면 추가 결론을 내리기가 어렵습니다. 각 쿼리에서 생성되는 SQL은 무엇입니까? 벤치 마크 테스트는 어떻게 구성되어 있습니까? 데이터베이스에있는 항목 수와 어떤 종류의 인덱스가 있습니까? 등등. – StriplingWarrior

+0

여기 좀 봐 http://stackoverflow.com/questions/11661319/linq-wherepredicate-vs-firstordefaultpredicate – Christos

+0

@ChristosPaisios : 이것은 실제로 적용되지 않습니다. Sqlite-net은 한 가지 방법과 다른 방법을 구현하는 테이블 개체를 반환합니다. –

답변

3

.Where은 SQL WHERE 절로 직접 변환되는 반면 .FirstOrDefault(lambda)은 데이터베이스에서 필터링되지 않은 레코드를 읽고 일치하는지 확인합니다.

이론적으로 후자를 전자로 자동 변환하는 것이 가능하지만 실제로는 수행되지 않습니다. 이것은 의식적인 디자인 결정도 아니고 버그도 아닙니다. 이론적으로 가능한 최적화가 구현되지 않았을뿐입니다.

+1

답장을 보내 주셔서 감사합니다. 도서관에 기부하지 않았으므로 불평하지는 않습니다. 기성품 인 래퍼를 사용하게되어 기쁩니다. 그러나 .. 생각을위한 음식으로서 ... 무언가가 한 방향으로 제시 될 때, 실제로 그것이 의도하는대로 행동하는 것이 일반적으로 좋은 생각입니다. 이 특정 행동은, 엄격하게 버그가 아니지만, 내 마음 속에는 하나 가까이에 있습니다. 나를위한 행동을 확인해 주셔서 감사합니다. 해결 방법은 간단하며 잘 작동합니다. –