Rom*_*kin 6 sql-server indexing entity-framework
我正在使用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
}
Run Code Online (Sandbox Code Playgroud)
并且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
);
Run Code Online (Sandbox Code Playgroud)
当然还有Id属性的索引
-- Creating primary key on [Id] in table 'EventInfoSet'
ALTER TABLE [dbo].[EventInfoSet]
ADD CONSTRAINT [PK_EventInfoSet]
PRIMARY KEY CLUSTERED ([Id] ASC);
Run Code Online (Sandbox Code Playgroud)
EventKey是字符串,实际上我用它来存储md5哈希(在字符串表示中).但问题是我的主要代码如下:
int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey).Count();
Run Code Online (Sandbox Code Playgroud)
和
int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey && e.DateStamp >= dateFrom && e.DateStamp < dateTo).Count();
Run Code Online (Sandbox Code Playgroud)
eventKey这里是一个字符串变量.如您所见,我经常处理EventKey属性.但我的表可能包含大量记录(最多5M).我需要这段代码尽可能快地工作.我没有找到任何选项将EventKey标记为设计器中的索引属性.我想知道:
谢谢!
当然还有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);
Run Code Online (Sandbox Code Playgroud)
请记住,群集密钥和主键是两个不同的,不相关的概念.您应首先阅读设计索引(包括链接中的所有子主题).
实体框架不会为您创建索引.实体框架仅创建数据库的骨架.如果要调整数据库的性能(如添加索引),则必须自行完成.之后,您可以先切换到数据库,也可以使用Entity Designer数据库生成Power Pack更新数据库而不是重新创建数据库(至少需要VS 2010 Premium).