2014-04-06 6 views
0

내가 샘플 설명하려고 내 질문을 표시하려면 : 나는 LockStatus을 선택합니다 이제엔티티 프레임 워크 성능

Id, UserName, Password, FName, LName, Gender, Birthday, 
HomeTel, Mobile, Fax, Email, LockStatus 

:

내가이 열이있는 테이블 UsersInfo을 가지고 있다고 가정하자 이 테이블에서. 기존 모드에서 우리는이 쿼리를 만들어 실행을 위해 SqlCommand로 보내 : 사용 엔티티 프레임 워크와

SELECT LockStatus FROM UsersInfo 

를 그리고 오늘, 우리는 쿼리에서 이것을 사용

var q = from r in new Data_DBEntities().UsersInfo 
     select new 
     { 
      r.LockStatus 
     }; 

법인 SQL :

SELECT UsersInfo.LockStatus 
FROM Data_DBEntities.UsersInfo 

이제 응용 프로그램을 시작하고 SQL Server 프로파일 러를 사용하여이 응용 프로그램을 추적합니다. 나는이 결과를 참조 쿼리 (일반 모드)의 첫 번째 유형을 사용하는 경우 :

SELECT 
[Extent1].[LockStatus] AS [LockStatus] 
FROM (SELECT 
     [UsersInfo].[Id] AS [Id], 
     [UsersInfo].[UserName] AS [UserName], 
     [UsersInfo].[Password] AS [Password], 
     [UsersInfo].[FName] AS [FName], 
     [UsersInfo].[LName] AS [LName], 
     [UsersInfo].[Gender] AS [Gender], 
     [UsersInfo].[Birthday] AS [Birthday], 
     [UsersInfo].[HomeTel] AS [HomeTel], 
     [UsersInfo].[Mobile] AS [Mobile], 
     [UsersInfo].[Fax] AS [Fax], 
     [UsersInfo].[Email] AS [Email], 
     [UsersInfo].[LockStatus] AS [LockStatus] 
     FROM [dbo].[UsersInfo] AS [UsersInfo]) AS [Extent1] 
:

SELECT LockStatus FROM UsersInfo 

을 내가 사용하지만 엔티티 프레임 워크 (LINQ || 법인 SQL)을 SQL Server 프로파일 러는이 결과를 보여

백그라운드에서 EF가 모든 열을 선택하는 것을 볼 수 있습니다.

내 질문은 : 단지 하나의 열을 선택하고 싶지만 EF는 모든 열을 선택합니다. 내 테이블에 10 만 개의 레코드가 있다면 그 성능은 정말 좋지 않을 것입니다!

아마도 함수 또는 저장 프로 시저를 사용한다고 말할 수 있지만 다른 테이블에서 다른 열을 선택하려는 경우에는 좋지 않습니다.

당신은 어떻게 생각하십니까? 어떤 방법이 있습니까?

+0

잘못된 것이 있습니다.EF는 모든 필드를 쿼리하여 객체를 생성합니다. 그러나 만약 당신이 질의에 유예를한다면, 그렇게하지 않을 것입니다. LINQ SQL 구문에 익숙하지 않아 기능적 구문을 선호하기 때문에 내 도움이 끝나는 곳입니다. 나는 확실히이 문제가 없다. – TomTom

+0

쿼리가 무거워 보이지만 EF (지금은 v6)가 전통적인 ADO.NET만큼 빠르며 쿼리가 올바르게 작성된 경우 수백만 행의 테이블이 있습니다. ** 성능 **에 대해 걱정이된다면 성능 **에 대한 테스트를 실행 해 보았습니까? –

답변

2

EF가 생성 한 쿼리에는 중복 된 파생 테이블이 있지만 궁극적으로는 하나의 열만 선택합니다. SQL Server 및 아마 모든 주류 RDBMS는이 경우 단일 열에 만 물리적으로 접촉합니다. 성능에 대해 걱정하지 마십시오. 이것은 화장품 일뿐입니다.

아무 것도 잘못하지 않았습니다. 당신을 위해 할 일이 없습니다.

0

LINQ 쿼리에 사용한 구문에 따라 중복 선택이 필요했습니다.

투영으로 2 개의 개별 개체가 생성되었습니다.

var q = from r in new Data_DBEntities().UsersInfo

는 새로운 오브젝트를 생성하고

select new 
    { 
     r.LockStatus 
    }; 

는 첫 번째에 기초하여 새로운 객체를 생성. 첫 번째 섹션에 new 키워드가 필요하지 않습니다.

쿼리를 변경하는 경우

가되게합니다 :

var q = from r in Data_DBEntities().UsersInfo 
    select new 
    { 
     r.LockStatus 
    }; 

당신이 추가 객체없이 익명의 돌출부를 얻을 것이다. (확장 영역을 기반으로하는 추가 필드가 없음)

+0

나는 이것을 시험해 본다 !! 하지만 그 오류는 – Jourmand

+0

@Jourmand : *** 무엇 *** 오류!?!?!? 기억하십시오 : ** 우리는 화면을 읽을 수없고 마음도 읽을 수 없습니다! –

+0

나의 직위 부호는 : 'var d = new Data_DBEntities(); var에 q는 d.UsersInfo의 연구에서 선택 = {r.LockStatus } 새로운;' 하지만 내 문제가 왜 필드의 모든 EF SELECT는 정상인지? LINQ를 사용하고 Entity SQL을 시도했지만 견인 방식으로 동일한 결과를 봅니다. – Jourmand