2011-10-19 2 views
5

저는 Entity Framework에서 몇 달 동안의 경험을 쌓았으며 대다수의 데이터 검색 linq 쿼리를 작성했습니다. 나는 무거운 sql 배경에서 왔고 성능 문제를 디버그하려고하는 경우 일부 SQL 성능 및 가독성을 최적화하려고합니다. 내가 생성 된 SQL의 일부를 나타 납니까Entity Framework 쿼리 최적화

내가이 쓸모없는 파생 테이블을하는 것을 방지 어떻게 열이있는 TABLEA {COL1, COL2, COL3}

select 
    Extent1.col1 
from 
(
    select col1, col2, col3 from tableA 
) AS Extent1 

내 질문이있다이 같은 일을 대신에해야합니까

select col1 from tableA 

어디서 필요합니까? 왜 때로는이 작업과 다른 작업을 수행하는지 이해할 수 없습니다 ...

+0

다른 사람들의 생각을 듣는 데 관심이 있습니다. 하지만 이것은 EF (다른 ORM의 것뿐만 아니라?)를 사용하는 것의 단점 중 하나라고 생각합니다. 생성 된 실제 SQL에 대해 많은 제어 권한을 상실하고 생성 된 SQL은 종종 매우 나쁩니다. – CodingGorilla

+0

가능한 복제본 [엔티티 프레임 워크에서 생성 된 쿼리 개선] (0120-998-005) –

답변

4

생성 된 쿼리의 실제 쿼리 실행 계획과 최적화 방법을 비교해 보셨습니까? 결과에 놀랄 지 모르지만 나는 알고 있습니다. 그리고 하위 최적화 쿼리처럼 보이게 만드는 작업을 훌륭하게 수행하는 것처럼 보이는 SQL 서버 팀의 개발자에게 깊은 존경심을 표했습니다.

내 경험이 다른 경우 청력에 관심이 있습니다. 보고있는 모든 쿼리에 대해 실제 성능 차이가 없었기 때문에 생성 된 쿼리를 변경하는 방법을 찾지 않았습니다.

편집 : 내 마지막 문은 여러 레코드의 삽입이 같은 거기 당신이 조심해야 확실히 N + 1 상황이며, 어떤 일괄 작업 (업데이트, 삭제 및 완전히 사실이 아니다 시간)은 개별 레코드로 작업하는 특성으로 인해 수동으로 쿼리를 작성하는 것과 성능면에서 거의 유사하지 않습니다. 그러나 관계없는 범위는 SQL Server 쿼리 최적화 프로그램에서 제거됩니다.

+0

안녕하세요 조엘, 일반적으로 당신이 맞습니다,하지만 이 "쓸모없는 파생 테이블"비즈니스를 여러 번 반복하는 약 300 행의 실제 불쾌한 쿼리가 몇 가지 있습니다. 해당 쿼리를 가져 와서 파생 테이블을 테이블에서 직접 선택하여 이후의 직접 선택으로 바꾸는 작업은 7 초에서 1 초까지 걸리는 커다란 쿼리를 필요로합니다 .... 그래서 나는 대부분 당신과 동의하지만, 어떻게하면 더 잘 linq을 최적화 할 수 있으므로이 문제에 부딪치지 않습니다. – Zom

+0

@Isamu : 일반적으로 LINQ 쿼리를 단순하게 만들 수 있다면 SQL도 간단 해집니다. 이 작업을 수행하는 데는 많은 기법이 있지만 처음부터 살펴볼 코드가 없으면 구체적인 조언을하는 것이 어렵습니다. EF 생성 코드에서 불필요한 열을 제거한 직접적인 결과로 7 배 이상의 성능 향상을보고 있습니까? 아니면 더 복잡한 변환을 수행하고 있습니까? – StriplingWarrior

+1

성능 차이를 테스트했을 때 쿼리 캐싱에 대한 정보가 있다고 가정합니다. EF 팀 블로그 (http://blogs.msdn.com/b/adonet/archive/2011/07/)에 블로그 게시물이 있습니다. 25/generated-sql-improvements-for-tpt-queries.aspx)는 생성 된 SQL의 성능 향상과 관련된 특정 문제에 대한 피드백을 제공합니다. 특정 게시물은 가장 최근의 릴리스에서 유형별 테이블 클래스 상속 계층 구조를 다룰 때 개선 된 사항에 대해 설명합니다. –