2009-11-04 2 views
1

, 나는 SQL을 볼 수있는 엔티티 프레임 워크 생성 된 SQL 청소기는 다음과 같이 생성되는 만들 수있는 방법 :나는 프로파일 러를 사용하는 경우 나 SQL Server Express를 2008으로 엔티티 프레임 워크를 사용하고

SELECT 
[Project1].[C1] AS [C1], 
[Project1].[EmployeeID] AS [EmployeeID], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[LastName] AS [LastName], 
[Project1].[Active] AS [Active], 
[Project1].[Updated] AS [Updated], 
[Project1].[Created] AS [Created], 
[Project1].[CreatedBy] AS [CreatedBy], 
[Project1].[Modified] AS [Modified], 
[Project1].[ModifiedBy] AS [ModifiedBy] 
FROM (SELECT 
    [Extent1].[EmployeeID] AS [EmployeeID], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[Active] AS [Active], 
    [Extent1].[Updated] AS [Updated], 
    [Extent1].[Created] AS [Created], 
    [Extent1].[CreatedBy] AS [CreatedBy], 
    [Extent1].[Modified] AS [Modified], 
    [Extent1].[ModifiedBy] AS [ModifiedBy], 
    1 AS [C1] 
    FROM [dbo].[Employee] AS [Extent1] 
) AS [Project1] 
ORDER BY [Project1].[LastName] ASC 

내가 부르는 것을 가지고 있습니까 하위 쿼리는 SQL Server 및/또는 내 응용 프로그램의 성능에 영향을 줍니까? 이 SQL 쿼리를 직접 작성하면 다음과 같이 보입니다.

SELECT 
[Project1].[EmployeeID] AS [EmployeeID], 
[Project1].[FirstName] AS [FirstName], 
[Project1].[LastName] AS [LastName], 
[Project1].[Active] AS [Active], 
[Project1].[Updated] AS [Updated], 
[Project1].[Created] AS [Created], 
[Project1].[CreatedBy] AS [CreatedBy], 
[Project1].[Modified] AS [Modified], 
[Project1].[ModifiedBy] AS [ModifiedBy] 
FROM [dbo].[Employee] AS [Project1] 
ORDER BY [Project1].[LastName] ASC 

이 클리너를 만드는 방법이 있습니까? 하위 쿼리가 만들어지는 이유는 무엇입니까? 내가 신경 써야 할까? LinqToEntities 사용하고 있습니다. 여기에 첫 번째 SQL 샘플을 생성하는 기능입니다 : 모든

public DTO.EmployeeDTO[] GetEmployees() 
{ 
    using (KDMEntities ctx = new KDMEntities()) 
    { 
     var employees = (from e in ctx.Employees 
         orderby e.LastName 
         select new DTO.EmployeeDTO 
         { 
          EmployeeID = e.EmployeeID, 
          FirstName = e.FirstName, 
          LastName = e.LastName, 
          Active = e.Active, 
          Updated = e.Updated, 
          Created = e.Created, 
          CreatedBy = e.CreatedBy, 
          Modified = e.Modified, 
          ModifiedBy = e.ModifiedBy 
         }).ToArray(); 
     return employees; 
    } 
} 

답변

5

첫째, 나는만큼 당신이 "충분"어떻게해야합니까로 말할 것 성능, 그것은 생산성 사이의 트레이드 오프 (trade-off)는의 (당신이 돈 ' SQL의 각 비트를 구성하고 수동으로 SqlDataReaders 등을 수동으로 읽는 것을 다루어야합니다.) 그리고 잠재적으로 성능.

조치를 취하고, 측정하고, 측정합니다. 이 실제로인지 여부를 조기에 지나치게 최적화하기 전에 확인하십시오. 하지 마.

둘째, EF에서 SQL 생성 프로세스에 연결할 수있는 확장 점을 알지 못합니다. 기본적으로 다음과 같은 선택 사항이 남아 있습니다. 성능이 충분히 좋으며 사실 EF가 수동으로 작성한 것과는 다른 방식으로 특정 명령문을 생성 할 수도 있다는 사실에 익숙합니다. 그런 다음이를 삭제하고 다른 것을 사용합니다.

다시 말하면 IT의 거의 모든 요소와 마찬가지로 성능과 생산성의 균형이 맞지 만 성능이 "충분 함"이라면 최적화에 대한 시간을 낭비하지 않아도됩니다. 관리자와 고객은 실제로 신경 쓰지 않습니다.

+1

+1을 먼저 측정 한 다음 결정하십시오. 조기 최적화는 블랙홀입니다. –

+0

나는 당신이하는 말에 동의하지 않지만 이것은 OP 질문에 답하지 않습니다. 내 생각에, 당신이 씬의 뒤에 무슨 일이 일어나고 있는지 알지 못한다면 이것은 잠재적 인 성능 악몽이다. 난 정확히 똑같은 문제에 부딪 혔고 EF가이 하위 쿼리를 만드는 것을 어떻게 막을 수 있는지 알고 싶습니다. – DMC

관련 문제