문제

엔티티 프레임 워크에 문제가 있습니다. 데이터베이스의보기에서 간단한 선택을 실행하고 있습니다. 그러나 EF가 생성하는 SQL을 볼 때 Select From을 사용하여 쿼리를 두 번 실행합니다. 이것이 작동하는 방식입니까? 매우 비효율적 인 것 같습니다.

var reads = (from rt in ctx.C2kReadsToTransfer
                     where rt.ReadDt > fromDate
                     && rt.ReadDt < toDate
                     select rt);

이것은 다음 SQL로 변환됩니다

SELECT 

 [Extent1].[AMRID] AS [AMRID]
 , [Extent1].[Comments] AS [Comments]
 , [Extent1].[ExternalSystemType] AS [ExternalSystemType]
 , [Extent1].[LastReadDt] AS [LastReadDt]
 , [Extent1].[ReadDt] AS [ReadDt]
 , [Extent1].[Reading] AS [Reading]
 , [Extent1].[Units] AS [Units]
 , [Extent1].[Transferred] AS [Transferred]



 FROM 
     (SELECT 
      [ReadsToTransfer].[AMRID] AS [AMRID]
      , [ReadsToTransfer].[Comments] AS [Comments]
      , [ReadsToTransfer].[ExternalSystemType] AS [ExternalSystemType]
      , [ReadsToTransfer].[LastReadDt] AS [LastReadDt]
      , [ReadsToTransfer].[ReadDt] AS [ReadDt]
      , [ReadsToTransfer].[Reading] AS [Reading]
      , [ReadsToTransfer].[Transferred] AS [Transferred]
      , [ReadsToTransfer].[Units] AS [Units]
      FROM [dbo].[ReadsToTransfer] AS [ReadsToTransfer])
    AS [Extent1]

특히 테이블에 우리와 마찬가지로 테이블에 2 억 5 천만 행이 포함되어있을 때 매우 비효율적입니다. 또한 코드의 끝에 a .take (2000)를 태클하면 첫 번째 선택에만 'Select Top 2000'을 넣습니다. 따라서 전체 테이블 인 Inside Select의 상위 2000을 선택하게합니다.

이것에 대한 생각이 있습니까?

도움이 되었습니까?

해결책

그것은 매우 비효율적 인 것 같습니다

나는 그렇게 생각하지 않습니다 ... OUTER SELECT는 내부 선택의 투영 (실제로 정체성 투영) 일 뿐이며, 투영은 무시할만한 성능 영향을 미칩니다 ...

상위 2000 절과 관련하여, 외부 선택에 있다는 사실이 DB가 내부 선택에서 모든 행을 읽는다는 것을 의미하지는 않습니다. 외부 선택이 요청하는 한 읽은 다음 중지합니다.

OUTER SELECT의 유무에 관계없이 쿼리를 수동으로 실행하십시오. 성능에 큰 차이가 없을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top