Ho una tabella di SQL Server 2014 simile al seguente:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Alcune persone del mio team hanno suggerito che l'indice cluster dovrebbe essere attivo OrderId
, ma penso che il CustomerId
+ OrderId
sarebbe una scelta migliore per i seguenti motivi:
- Quasi tutte le query cercheranno
WHERE CustomerId = @param
, noOrderId
CustomerId
è una chiave esterna per laCustomer
tabella, quindi avere un indice cluster conCustomerId
dovrebbe accelerare i join- Sebbene
CustomerId
non sia univoco, avere laOrderId
colonna aggiuntiva specificata nell'indice garantirà l'univocità (possiamo usare laUNIQUE
parola chiave durante la creazione dell'indice cluster su quelle 2 colonne, per evitare il sovraccarico di non avere unicità) - Una volta inseriti i dati, il
CustomerId
eOrderId
non cambiano mai, quindi queste righe non si muoveranno dopo la scrittura iniziale. - L'accesso ai dati avviene tramite un ORM che richiede tutte le colonne per impostazione predefinita, quindi quando
CustomerId
arriva una query basata su , l'indice cluster sarà in grado di fornire tutte le colonne senza alcun lavoro aggiuntivo.
L' approccio CustomerId
e OrderId
suona come l'opzione migliore data quanto sopra? Oppure, è di OrderId
per sé migliore, dal momento che è un'unica colonna che garantisce l'unicità da sola?
Attualmente, la tabella ha un indice cluster attivo OrderId
e un indice non cluster attivo CustomerId
, ma non copre, quindi poiché stiamo usando un ORM e sono richieste tutte le colonne, è un lavoro extra per recuperarli. Quindi, con questo post, sto provando a considerare il miglioramento delle prestazioni con un CI migliore.
L'attività sul nostro DB è di circa l'85% in lettura e il 15% in scrittura.