J'ai une table SQL Server 2014 qui ressemble à ceci:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Certaines personnes de mon équipe ont suggéré que l'index clusterisé soit activé OrderId
, mais je pense que le CustomerId
+ OrderId
serait un meilleur choix pour les raisons suivantes:
- Presque toutes les requêtes seront recherchées
WHERE CustomerId = @param
, pasOrderId
CustomerId
est une clé étrangère de laCustomer
table, donc avoir un index cluster avecCustomerId
devrait accélérer les jointures- Bien qu'il
CustomerId
ne soit pas unique, avoir laOrderId
colonne supplémentaire spécifiée dans l'index garantira l'unicité (nous pouvons utiliser leUNIQUE
mot - clé lors de la création de l'index cluster sur ces 2 colonnes, pour éviter le surcoût de ne pas avoir d'unicité) - Une fois les données insérées, le
CustomerId
etOrderId
ne change jamais, donc ces lignes ne se déplaceraient pas après l'écriture initiale. - L'accès aux données se fait via un ORM qui demande toutes les colonnes par défaut, donc quand une requête basée sur
CustomerId
arrive, l'index clusterisé pourra fournir toutes les colonnes sans aucun travail supplémentaire.
L' approche CustomerId
et OrderId
semble-t-elle la meilleure option compte tenu de ce qui précède? Ou, est-il OrderId
meilleur en soi, car il s'agit d'une seule colonne qui garantit l'unicité en soi?
Actuellement, la table a un index clusterisé OrderId
et un index non clusterisé CustomerId
, mais il ne couvre pas, donc puisque nous utilisons un ORM et que toutes les colonnes sont demandées, il est supplémentaire de les récupérer. Donc, avec ce post, j'essaie d'envisager d'améliorer les performances avec un meilleur CI.
L'activité sur notre base de données est d'environ 85% de lectures et 15% d'écritures.