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
+ OrderId
sería una mejor opción por las siguientes razones:
- Casi todas las consultas se buscarán
WHERE CustomerId = @param
, noOrderId
CustomerId
es una clave externa de laCustomer
tabla, por lo que tener un índice agrupado conCustomerId
debería acelerar las uniones- Si bien
CustomerId
no es único, tener laOrderId
columna adicional especificada en el índice garantizará la unicidad (podemos usar laUNIQUE
palabra 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,
CustomerId
yOrderId
nunca 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
CustomerId
entra una consulta basada en, el índice agrupado podrá proporcionar todas las columnas sin ningún trabajo adicional.
¿El enfoque CustomerId
y OrderId
suena como la mejor opción dada lo anterior? ¿O es OrderId
mejor por sí solo, ya que es una sola columna que garantiza la unicidad por sí misma?
Actualmente, la tabla tiene un índice agrupado activado OrderId
y 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.