使用Entity Framework管理数据库索引的正确方法

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标记为设计器中的索引属性.我想知道:

  1. 我怎样才能让事情变得更快?我的代码根本不用担心它吗?
  2. 是否有任何温和的方法可以强制.NET开发环境自动生成索引字段?
  3. 如果没有温和的方式,我必须手动更新,我怎样才能更好地组织事情自动完成呢?
  4. 也许你给我一个链接到文章用索引解释所有这些东西,因为我的知识缺乏这里.

谢谢!

Rem*_*anu 5

当然还有Id属性的索引

为什么'当然'?如果你的主要通道,因为你自己承认,是来算EventKey,还是EventKeyDateStamp 那么你最好的聚集键(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)

请记住,群集密钥和主键是两个不同的,不相关的概念.您应首先阅读设计索引(包括链接中的所有子主题).

  • 但你是对的,由于缺乏更多信息,更保守的建议是在`(EventKey,DateStamp)`上添加一个非聚集索引. (2认同)

Lad*_*nka 5

实体框架不会为您创建索引.实体框架仅创建数据库的骨架.如果要调整数据库的性能(如添加索引),则必须自行完成.之后,您可以先切换到数据库,也可以使用Entity Designer数据库生成Power Pack更新数据库而不是重新创建数据库(至少需要VS 2010 Premium).