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

标签 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. 也许你能给我一个链接 文章解释了所有这些事情 有索引,因为我的知识缺乏 在这里。

谢谢!

最佳答案

And of course, an index for Id property

为什么是“当然”?如果您的主要访问方式(正如您自己所承认的)是通过 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首先(包括链接中的所有子主题)。

关于sql-server - 使用 Entity Framework 管理数据库索引的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5387592/

相关文章:

sql - 查找同一列中的日期范围

SQL : Retrieve inserted row IDs array/table

c# - 迁移 : No DbContext was found in assembly

python - 使用 Pandas 中的方法链接分配给列的子集

python - Python 中的链表 - Append、Index、Insert 和 Pop 函数。不确定代码/错误

sql-server - Sql Server 死锁对象 ID 太大

sql-server - 在存储过程中使用 SAVE TRANSACTION SavePointName

entity-framework - 没有工作单元模式的 Entity Framework

c# - 如何去掉 EF 添加的对象名称后缀?

索引对象列表的pythonic方法