Étant donné une table avec une clé primaire, par exemple:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
nous avons une clé primaire unique CustomerID
.
Traditionnellement, je pourrais alors avoir besoin d'indices de couverture supplémentaires; par exemple pour trouver rapidement un utilisateur soit CustomerID
ou Email
:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
Et ce sont les types d'index que j'ai créés pendant des décennies.
Il n'est pas nécessaire d'être unique, mais c'est en fait
L'index lui-même existe pour éviter une analyse de table; il s'agit d'un indice de couverture afin de favoriser les performances (l'indice n'est pas là comme une contrainte pour imposer l'unicité).
Aujourd'hui, je me suis souvenu d'une petite quantité d'informations - SQL Server peut utiliser le fait que:
- une colonne a une contrainte de clé étrangère
- une colonne a un index unique
- une contrainte est fiable
afin de l'aider à optimiser l'exécution de ses requêtes. En fait, à partir du Guide de conception d'index SQL Server :
Si les données sont uniques et que vous souhaitez que l'unicité soit appliquée, la création d'un index unique au lieu d'un index non unique sur la même combinaison de colonnes fournit des informations supplémentaires pour l'optimiseur de requête qui peut produire des plans d'exécution plus efficaces . La création d'un index unique (de préférence en créant une contrainte UNIQUE) est recommandée dans ce cas.
Étant donné que mon index multi-colonnes contient la clé primaire, cet index composite sera de facto unique. Ce n'est pas une contrainte que j'ai particulièrement besoin que SQL Server applique à chaque insertion ou mise à jour; mais le fait est que cet index non cluster est unique.
Y a-t-il un avantage à marquer cet index unique de facto comme réellement unique?
CRÉER UN INDEX UNIQUE IX_Customers_CustomerIDEmail ON Clients ( N ° de client, Email )
Il me semble que SQL Server pourrait être assez intelligent pour réaliser que mon index est déjà unique du fait qu'il contient la clé primaire.
- Mais peut-être qu'il ne le sait pas, et il y a un avantage pour l'optimiseur si je déclare l'index comme unique de toute façon.
- Sauf peut-être que cela pourrait maintenant entraîner des ralentissements lors des insertions et des mises à jour, où il doit effectuer des vérifications d'unicité - là où auparavant il n'avait jamais dû le faire auparavant.
- À moins qu'il ne sache, l'index est garanti d'être déjà unique, car il contient la clé primaire.
Je ne trouve aucune indication de Microsoft sur la procédure à suivre lorsqu'un index composite contient la clé primaire.
Les avantages des index uniques sont les suivants:
- L'intégrité des données des colonnes définies est assurée.
- Des informations supplémentaires utiles à l'optimiseur de requêtes sont fournies.
Dois-je marquer un index composite comme unique s'il contient déjà la clé primaire? Ou SQL Server peut-il comprendre cela par lui-même?