2011-03-22 4 views
5

Estoy compilando mi aplicación con Entity Framework (primer principio del modelo). También estoy usando MS SQL Server 2008 para almacenar todos los datos de mi aplicación.La forma correcta de administrar índices de base de datos con Entity Framework

Después de algún tiempo de desarrollar Tengo el siguiente código:

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 
} 

y Visual diseñador de la base de datos del estudio han creado trozo especial de código SQL para mapear esta entidad a la base de datos:

-- 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 
); 

Y por supuesto, un índice para la propiedad Id.

-- Creating primary key on [Id] in table 'EventInfoSet' 
ALTER TABLE [dbo].[EventInfoSet] 
ADD CONSTRAINT [PK_EventInfoSet] 
    PRIMARY KEY CLUSTERED ([Id] ASC); 

El EventKey es una cadena, y en realidad lo uso para almacenar md5 hash (en representación de cadenas). Pero la cosa es que mi código principal se parece a:

int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey).Count(); 

y

int cnt = context.EventInfoSet.Where(e => e.EventKey == eventKey && e.DateStamp >= dateFrom && e.DateStamp < dateTo).Count(); 

eventKey que aquí hay una variable de cadena. Como puede ver, a menudo trato con la propiedad de EventKey. Pero mi tabla podría contener una gran cantidad de registros (hasta 5 millones). Y necesito este código para trabajar lo más rápido posible. No encontré ninguna opción para marcar EventKey como propiedad de índice en el diseñador. Y quiero saber:

  1. ¿cómo puedo hacer las cosas más rápido? do Tengo que preocuparme por eso con mi código?
  2. ¿Hay alguna manera gentil para forzar .NET desarrollo entorno generar campo de índice automáticamente?
  3. si no hay manera suave, y tengo que actualizarlo manualmente, ¿cómo puedo organizar cosas mejor hacerlo automáticamente?
  4. puede ser que me dé un enlace al artículo que explica todas estas cosas con índices, porque mi conocimiento carece de aquí.

¡Gracias!

+0

Consulte estas otras [preguntas sobre SO en el modelo EF primero] (http://stackoverflow.com/questions/3333674/entity-framework-4-add-index-in-model-first-design) para obtener algunas ideas –

+2

5M no está cerca de ser enorme, por cierto. –

Respuesta

5

Y, por supuesto, un índice para Id propiedad

Por qué 'por supuesto'? Si su acceso principal, como usted mismo admite, es contar por EventKey o EventKey y DateStamp entonces su clave mejor en clúster es (EventKey, DateStamp), no ID:

CREATE CLUSTERED INDEX cdx_EventInfoSet 
    ON [dbo].[EventInfoSet] ([EventKey], [DateStamp]); 
ALTER TABLE [dbo].[EventInfoSet] 
    ADD CONSTRAINT [PK_EventInfoSet]  
    PRIMARY KEY NONCLUSTERED ([Id] ASC); 

Recuerde, la clave agrupada y la clave primaria son dos conceptos distintos, no relacionados. Primero debe leer Designing Indexes (incluidos todos los temas secundarios en el enlace).

+0

Estaba yendo al día - un índice agrupado compuesto en (EventKey, DateStamp) probablemente no sea una opción muy sabia .... demasiado amplio, compuesto, posiblemente cambiante, y definitivamente no siempre creciente ... –

+0

Patrón de acceso triunfa ancho de índice y fragmentación. A pesar de que ambas consultas de ejemplo son agregados y podrían ser atendidas por un índice no agrupado también, esperaría patrones de acceso más similares que requerirían cada vez más campos incluidos para ofrecer cobertura. Por lo tanto, ultimo, espero que este sea el índice agrupado. –

+2

pero tiene razón, a falta de más información, una recomendación más conservadora sería simplemente agregar un índice no agrupado en '(EventKey, DateStamp)'. –

5

Entidad marco no creará índice para usted. El marco de la entidad solo crea el esqueleto de la base de datos.Si desea modificar el rendimiento de su base de datos (como agregar índices), debe hacerlo usted mismo. Después de eso, puede cambiar a la base de datos primero o puede usar Entity Designer Database Generation Power Pack para actualizar su base de datos en lugar de volver a crearla (necesitará al menos VS 2010 Premium).

Cuestiones relacionadas