2009-04-17 3 views
2

EDM 엔터티를 데이터베이스 (SQL Server 2005) 뷰에 매핑했습니다. 기업은 다음과 같이 정의되어있다 뷰에 해당하는 ID, 이름 및 DateInserted의 속성을 가진 간단한 영화 엔티티입니다 :Entity Framework 생성 된 뷰에 매핑 된 엔터티 용 SQL

SELECT iMovieID, vchName, dbo.t_Movie 함께 FROM dtInsertDate
(NOLOCK)

테이블 t_Movie은 다음과 같은 정의가 있습니다.

는 TABLE [DBO]를 CREATE [t_Movie (
[iMovieID [INT] IDENTITY (1,1)
[vchName] VARCHAR NULL NOT,
[dtInsertDate [날짜] NULL,
CONSTRAINT [PK_t_Movie] PRIMARY KEY 클러스터링
( [iMovieID] ASC
) WITH (NULL NOT PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ON [PRIMARY]
) ON ALLOW_PAGE_LOCKS = ON) PRIMARY]
GO

I 엔티티에 간단한 Linq에 쓰기 질문 같은 : 여기

var q = from m in context.v_Movie where m.vchName.Contains("Ocean") select m; 
      foreach (var movie in q) 
      { 
       Console.WriteLine("{0}:{1}",movie.iMovieID, movie.vchName); 
      } 

는 프로파일에 의해 캡처 엔티티 프레임 워크에 의해 생성 된 SQL은이다.


[Extent1]에서 [iMovieID] AS [iMovieID,
[Extent1] . vchName] AS [vchName,
는 [Extent1]. dtInsertDate] FROM
[dtInsertDate 바와 같이 (
[v_Movie]를 선택. iMovieID] iMovieID,
가 [v_Movie]. VCH AS 이름] AS [vchName,
[v_Movie]. dtInsertDate] AS [dtInsertDate [DBO] FROM
. v_Movie] AS [v_Movie]) Extent1]
WHERE (CAST (CHARINDEX (AS N'Ocean '[Extent1] vchName]) INT AS))> 0

DBA는 내부 SELECT 우려가 있습니다..


[v_Movie] iMovieID 바와 같이 선택 [ iMovieID],
[v_Movie]. [vchName] AS [vchName],
,451,515,[v_Movie]. [dtInsertDate] AS [dtInsertDate] [DBO] FROM
는. v_Movie] AS [v_Movie]) [Extent1]

은 시간이 지남에 몇 가지 심각한 성능 문제가 발생할 것입니다 AS 테이블은 모든 선택하기 때문에 성장에 따라 보기에서 임시 테이블 ([Extent1])로 행을 선택한 다음 외부 SELECT가이 임시 테이블에서 선택합니다.

EF이 작업을 수행 할 필요가 왜 어떤 특별한 이유는 생성 된 SQL 수 없었다 다음 어떤 이유가있다 :.


[v_Movie] 선택 [iMovieID] AS [iMovieID ]
[v_Movie]. vchName] AS [vchName,
[v_Movie]. dtInsertDate [DBO] FROM
[dtInsertDate] AS. v_Movie] v_Movie]
WHERE (CAST AS (CHARINDEX (N'Ocean ', [Extent1]. [vchName]) AS int))> 0

다음 SQL을 사용하여 100,000 개의 레코드로 테이블을 채웠지 만 LINQ 쿼리를 실행할 때 성능 저하를 알지 못했습니다.

가 @counter가
가 세트 @counter = 0
동안 < 100000
@counter
세트 @counter = @counter + 1 시작 값 int
선언을 BEGIN : 프로파일 조회가 제하에 실행되었습니다

INSERT INTO t_Movie (vchName) 값 ('영화'의 + CONVERT (VARCHAR @ 카운터))
단부
END

,

이것은 유효한 문제입니까?

PS -

엔티티 내가 사용했던 쿼리에 (CAST INT AS (CHARINDEX (N'Ocean '[Extent1] [vchName])).) 는 LINQ 이후 여기에 문제가되지 않습니다 단지 삽화를위한 것입니다.

모든 통찰력은 많은 XML 편집기를 사용하여 .EDMX 파일에

답변

1

봐 주시면 감사하겠습니다. 뷰에 대한 select 문이있는 무비 뷰에 대해 찾을 수있는 항목이 있습니다. select 문을 제거하고 나머지 뷰 XML을 테이블과 비슷하게 보이게하십시오. EF는 기본 이름이 아닌보기에서 열을 다른 이름으로 매핑하려고한다는 것을 순전히 알기 때문에이 내부 선택을 얻게됩니다.

관련 문제