gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:33:15 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com