Tengo una tabla de SQL Server 2014 que se parece a la siguiente:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Algunas personas de mi equipo han sugerido que el índice agrupado debería estar activado OrderId, pero creo que el CustomerId+ OrderIdsería una mejor opción por las siguientes razones:
- Casi todas las consultas se buscarán
WHERE CustomerId = @param, noOrderId CustomerIdes una clave externa de laCustomertabla, por lo que tener un índice agrupado conCustomerIddebería acelerar las uniones- Si bien
CustomerIdno es único, tener laOrderIdcolumna adicional especificada en el índice garantizará la unicidad (podemos usar laUNIQUEpalabra clave al crear el índice agrupado en esas 2 columnas, para evitar la sobrecarga de no tener unicidad) - Una vez que se insertan los datos,
CustomerIdyOrderIdnunca cambian, por lo que estas filas no se moverían después de la escritura inicial. - El acceso a los datos se realiza a través de un ORM que solicita todas las columnas de manera predeterminada, por lo que cuando
CustomerIdentra una consulta basada en, el índice agrupado podrá proporcionar todas las columnas sin ningún trabajo adicional.
¿El enfoque CustomerIdy OrderIdsuena como la mejor opción dada lo anterior? ¿O es OrderIdmejor por sí solo, ya que es una sola columna que garantiza la unicidad por sí misma?
Actualmente, la tabla tiene un índice agrupado activado OrderIdy un índice no agrupado activado CustomerId, pero no está cubriendo, por lo que dado que estamos usando un ORM y se solicitan todas las columnas, es un trabajo adicional recuperarlos. Entonces, con esta publicación, estoy tratando de considerar mejorar el rendimiento con un CI mejor.
La actividad en nuestra base de datos es de aproximadamente 85% de lecturas y 15% de escrituras.
