我正在使用Entity Framework构建我的应用程序(模型第一原则)。我也使用MS SQL Server 2008来存储我的应用程序的所有数据。
经过一段时间的开发后,我有以下代码:
public partial class EventInfo
{
#region Primitive Properties
public virtual int Id
{
get;
set;
}
public virtual string EventName
{
get;
set;
}
public virtual string EventKey
{
get;
set;
}
public virtual System.DateTime DateStamp
{
get;
set;
}
#endregion
}
Visual Studio数据库设计者已经创建了特殊的sql代码块来将此实体映射到数据库:
-- Creating table 'EventInfoSet'
CREATE TABLE [dbo].[EventInfoSet] (
[Id] int IDENTITY(1,1) NOT NULL,
[EventName] nvarchar(max) NOT NULL,
[EventKey] nchar(32) NOT NULL,
[DateStamp] datetime NOT NULL
);
当然,Id属性的索引
-- Creating primary key on [Id] in table 'EventInfoSet'
ALTER TABLE [dbo].[EventInfoSet]
ADD CONSTRAINT [PK_EventInfoSet]
PRIMARY KEY CLUSTERED ([Id] ASC);
EventKey是字符串,实际上我用它来存储md5哈希(在字符串表示中)。但问题是我的主要代码如下:
int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey).Count();
和
int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey && e.DateStamp >= dateFrom && e.DateStamp < dateTo).Count();
eventKey 这是一个字符串变量。如您所见,我经常处理EventKey属性。但我的表可能包含大量记录(最多5M)。我需要这段代码尽可能快地工作。我没有找到任何选项将EventKey标记为设计器中的索引属性。我想知道:
谢谢!
答案 0 :(得分:5)
当然,也就是Id的索引 属性
为什么'当然'?如果您自己承认,您的主要访问权限是按EventKey
,EventKey
和DateStamp
计算,那么您最好的群集密钥是(EventKey
,DateStamp
),而不是ID
:
CREATE CLUSTERED INDEX cdx_EventInfoSet
ON [dbo].[EventInfoSet] ([EventKey], [DateStamp]);
ALTER TABLE [dbo].[EventInfoSet]
ADD CONSTRAINT [PK_EventInfoSet]
PRIMARY KEY NONCLUSTERED ([Id] ASC);
请记住,群集密钥和主密钥是两个截然不同的概念。您应首先阅读Designing Indexes(包括链接中的所有子主题)。
答案 1 :(得分:5)
实体框架不会为您创建索引。实体框架仅创建数据库的骨架。如果要调整数据库的性能(如添加索引),则必须自行完成。之后,您可以先切换到数据库,也可以使用Entity Designer Database Generation Power Pack更新数据库而不是重新创建数据库(至少需要VS 2010 Premium)。