2011-03-22 42 views
5

我使用實體框架(模型第一原則)構建我的應用程序。我還使用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. 可能是你給我一個鏈接到 文章解釋所有這些東西 索引,因爲我的知識缺乏 在這裏。

謝謝!

+0

查看這些其他的[關於EF模型的SO問題](http://stackoverflow.com/questions/3333674/entity-framework-4-add-index-in-model-first-design)一些想法 – 2011-03-22 06:31:32

+2

5M遠非如此,順便說一句。 – 2011-03-22 06:38:26

回答

5

和當然,對於標識 財產

爲什麼 '當然' 的指標?如果你的主要通道,因爲你自己承認,是EventKey,或EventKeyDateStamp算那麼你最好的聚集鍵(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(包括鏈接中的所有子主題)。

+0

我只是要去一天 - (EventKey,DateStamp)上的複合聚集索引可能不是一個非常明智的選擇....太寬,複合,可能會改變,並且絕對不會增加... – 2011-03-22 06:33:44

+0

訪問模式勝過索引寬度和碎片。儘管這兩個示例查詢都是聚合的,並且也可以由非聚集索引提供服務,但我期望更多類似的訪問模式,這將需要越來越多的包含字段來提供覆蓋。因此,我期望這是聚集索引。 – 2011-03-22 06:37:36

+2

但是你是對的,缺乏更多的信息,更保守的建議是在'(EventKey,DateStamp)'上添加一個非聚集索引。 – 2011-03-22 06:39:29

5

實體框架不會爲您創建索引。實體框架僅創建數據庫的骨架。如果你想調整你的數據庫的性能(如添加索引),你必須自己做。之後,您可以先切換到數據庫,或者您可以使用Entity Designer Database Generation Power Pack更新數據庫而不是重新創建它(至少需要VS 2010 Premium)。

相關問題