我有一個非常簡單的表叫Member
,其中包括以下內容:如何強制實體框架4.0,產生大小相等的參數及其相應的數據庫列
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]
我正在使用EF查詢4.0從一個DataContext如下:
return Members.SingleOrDefault(member => member.ExternalId == externalId);
生成的SQL是這樣的:
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'
從性能POV看,此查詢不是最理想的,因爲它自動將Member_ExternalId列轉換爲varchar(8000)
,而列本身僅限於varchar(32)
。 有沒有辦法強制EF生成大小等於其相應行的動態參數?
爲什麼將參數強制轉換爲varchar(8000)是不理想的? – codeulike
我應該澄清;我們的駐地DBA堅持認爲它在內存分配方面並不理想。他沒有詳細說明。你怎麼看? –
他在理論上可能是對的,但現在8k並沒有那麼多,並且可能很快就會重新分配。執行SQL語句的兩個變體的幾百次運行,一次使用varchar(8000),另一次使用varchar(32),查看是否有任何性能差異。 – codeulike