Правильный способ управления индексами базы данных с Entity Framework - PullRequest
6 голосов
/ 22 марта 2011

Я создаю свое приложение с помощью 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. Но моя таблица может содержать огромное количество записей (до 5 миллионов). И мне нужен этот код, чтобы работать как можно быстрее. Я не нашел никакой возможности пометить EventKey как свойство индекса в конструкторе. И я хочу знать:

  1. как я могу сделать вещи быстрее? делать Я должен беспокоиться об этом вообще мой код?
  2. есть ли мягкий способ форсировать разработку .NET среда генерирует индексное поле автоматически
  3. если нет мягкий путь, и я должен обновить его вручную, как я могу организовать вещи лучше сделать это автоматически?
  4. может быть, вы дадите мне ссылку на статья, объясняющая все эти вещи с индексами, потому что мои знания не хватает здесь.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 22 марта 2011

Entity Framework не будет создавать индекс для вас.Entity Framework создает только скелет базы данных.Если вы хотите настроить свою базу данных для повышения производительности (например, добавив индексы), вы должны сделать это самостоятельно.После этого вы можете сначала переключиться на базу данных или использовать Power Generation Power Pack для создания базы данных , чтобы обновить базу данных вместо того, чтобы воссоздавать ее (вам потребуется как минимум VS 2010 Premium).

5 голосов
/ 22 марта 2011

И, конечно же, индекс для Id свойство

Почему «конечно»? Если ваш основной доступ, как вы сами признаете, заключается в подсчете на 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);

Помните, кластерный ключ и первичный ключ - это две разные, не связанные друг с другом концепции. Сначала прочитайте Разработка индексов (включая все подтемы в ссылке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...