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+ OrderIdsarebbe una scelta migliore per i seguenti motivi:
- Quasi tutte le query cercheranno
WHERE CustomerId = @param, noOrderId CustomerIdè una chiave esterna per laCustomertabella, quindi avere un indice cluster conCustomerIddovrebbe accelerare i join- Sebbene
CustomerIdnon sia univoco, avere laOrderIdcolonna aggiuntiva specificata nell'indice garantirà l'univocità (possiamo usare laUNIQUEparola 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
CustomerIdeOrderIdnon 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
CustomerIdarriva una query basata su , l'indice cluster sarà in grado di fornire tutte le colonne senza alcun lavoro aggiuntivo.
L' approccio CustomerIde OrderIdsuona come l'opzione migliore data quanto sopra? Oppure, è di OrderIdper sé migliore, dal momento che è un'unica colonna che garantisce l'unicità da sola?
Attualmente, la tabella ha un indice cluster attivo OrderIde 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.