2012-07-02 2 views
4

해당 데이터베이스 컬럼에 해당하는 크기의 매개 변수를 생성하는 엔티티 프레임 워크 4.0을 강제하는 방법 : 나는 EF를 사용하여 쿼리를 실행 해요다음과 같이 구성되어 나는 아주 간단한 테이블 <code>Member</code>라는이

CREATE TABLE [dbo].[Member](
    [Member_MemberId] [int] IDENTITY(1000,1) NOT NULL, 
    [Member_ExternalId] [varchar](32) NULL, 
    [Member_ConsumerId] [varchar](32) NULL, 
CONSTRAINT [PK_Member] PRIMARY KEY NONCLUSTERED 
(
    [Member_MemberId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

을 데이터 컨텍스트에서 4.0는 다음과 같이

exec sp_executesql N'SELECT TOP (2) 
[Extent1].[Member_MemberId] AS [Member_MemberId], 
[Extent1].[Member_ExternalId] AS [Member_ExternalId], 
[Extent1].[Member_ConsumerId] AS [Member_ConsumerId] 
FROM [dbo].[Member] AS [Extent1] 
WHERE [Extent1].[Member_ExternalId] = @p__linq__0',N'@p__linq__0 varchar(8000)',@p__linq__0='Paul' 
:

return Members.SingleOrDefault(member => member.ExternalId == externalId); 

생성 된 SQL은 다음과 같습니다

성능 POV에서 열 자체가 varchar(32)으로 제한 될 때 Member_ExternalId 열을 varchar(8000)으로 자동 캐스팅하는 경우이 쿼리는 차선입니다. EF가 해당 행과 동일한 크기의 on-the-fly 매개 변수를 생성하도록 강제 할 수 있습니까?

+0

매개 변수를 varchar (8000)로 형 변환하는 것이 차선책입니까? – codeulike

+0

나는 분명히해야한다; 우리의 거주 DBA는 메모리 할당 측면에서 차선책이라고 주장합니다. 그는 더 이상 세부 사항에 들어 가지 않았다. 당신 의견은 뭐니? –

+0

그는 이론상으로 맞을지 모르지만 요즘에는 8k가 그다지 많지 않으므로 아마도 다시 할당되지 않을 것입니다. SQL 문에 varchar (8000) 및 varchar (32)를 사용하여 두 가지 변형을 수백 번 실행하고 성능 차이가 있는지 확인합니다. – codeulike

답변

1

직접 구현할 방법이없는 것처럼 보입니다. 필자는 실행 계획에서 일관성을 보장하는 기본 제공 기능이라고 가정합니다. 그 동안 쿼리를 저장 프로 시저로 대체했습니다.

+0

EF 팀은 모델을 기반으로 올바른 매개 변수 크기와 유형을 구현해야한다고 생각합니다. 구현하기가 어렵습니까? 그러한 요청을 EF 팀에 보내야합니까? 어떻게 생각해? – Naomi

+0

나오미가 잘 모르겠습니다. EF 대 직접 SQL의 사용을 정당화한다는 측면에서 볼 때 거래 차단기는 아니지만 DB 관리자가 일반적으로 최적화 할 문제로 선택하는 유형입니다. –

+1

EF 팀에 제안을 추가했습니다. https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/6286842-for-char-nchar-and-varchar-nvarchar-columns-use-th를보고 원하는 경우 투표하십시오. – Naomi

관련 문제