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

时间:2011-03-22 06:23:28

标签: sql-server entity-framework indexing

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

  1. 我怎样才能让事情变得更快?做 我根本不用担心它 我的代码?
  2. 有什么温和的方式 强制.NET开发 环境生成索引字段 自动?
  3. 如果没有 温柔的方式,我必须更新它 手动,我如何组织事情 最好自动完成吗?
  4. 可能是你给我一个链接 文章解释所有这些事情 有索引,我的知识缺乏 这里。
  5. 谢谢!

2 个答案:

答案 0 :(得分:5)

  

当然,也就是Id的索引   属性

为什么'当然'?如果您自己承认,您的主要访问权限是按EventKeyEventKeyDateStamp计算,那么您最好的群集密钥是(EventKeyDateStamp ),而不是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)。