我正在使用 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 标记为索引属性的选项。我想知道:
- 如何才能让事情变得更快?做 我必须担心它 我的代码?
- 有什么温和的方法吗 强制.NET开发 环境生成索引字段 自动?
- 如果没有 温柔的方式,我必须更新它 手动,我如何组织事情 自动完成更好吗?
- 也许你能给我一个链接 文章解释了所有这些事情 有索引,因为我的知识缺乏 在这里。
谢谢!
最佳答案
And of course, an index for Id property
为什么是“当然”?如果您的主要访问方式(正如您自己所承认的)是通过 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);
请记住,聚集键和主键是两个不同的、不相关的概念。您应该阅读Designing Indexes首先(包括链接中的所有子主题)。
关于sql-server - 使用 Entity Framework 管理数据库索引的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5387592/