REMARQUE: cette réponse traite du développement de classe entreprise dans le grand .
Il s'agit d'un problème de SGBDR, pas seulement de SQL Server, et le comportement peut être très intéressant. D'une part, s'il est courant que les clés primaires soient automatiquement indexées (de manière unique), ce n'est PAS absolu. Il y a des moments où il est essentiel qu'une clé primaire ne soit PAS indexée de manière unique.
Dans la plupart des SGBDR, un index unique sera automatiquement créé sur une clé primaire s'il n'en existe pas déjà une . Par conséquent, vous pouvez créer votre propre index sur la colonne de clé primaire avant de le déclarer comme clé primaire, puis cet index sera utilisé (s'il est acceptable) par le moteur de base de données lorsque vous appliquez la déclaration de clé primaire. Souvent, vous pouvez créer la clé primaire et autoriser la création de son index unique par défaut, puis créer votre propre index alternatif sur cette colonne, puis supprimer l'index par défaut.
Maintenant, pour la partie amusante - quand ne voulez-vous PAS un index de clé primaire unique? Vous n'en voulez pas et ne pouvez pas en tolérer un, lorsque votre table acquiert suffisamment de données (lignes) pour rendre la maintenance de l'index trop coûteuse. Cela varie en fonction du matériel, du moteur SGBDR, des caractéristiques de la table et de la base de données et de la charge du système. Cependant, il commence généralement à se manifester une fois qu'une table atteint quelques millions de lignes.
Le problème essentiel est que chaque insertion d'une ligne ou mise à jour de la colonne de clé primaire entraîne une analyse d'index pour garantir l'unicité. Cette analyse d'index unique (ou son équivalent dans n'importe quel SGBDR) devient beaucoup plus coûteuse à mesure que la table grandit, jusqu'à ce qu'elle domine les performances de la table.
J'ai traité ce problème à plusieurs reprises avec des tables de deux milliards de lignes, 8 To de stockage et quarante millions d'insertions de lignes par jour. J'ai été chargé de repenser le système impliqué, ce qui comprenait la suppression de l'index de clé primaire unique pratiquement comme première étape. En effet, l'abandon de cet indice était nécessaire en production simplement pour se remettre d'une panne, avant même de se rapprocher d'une refonte. Cette refonte comprenait la recherche d'autres moyens d'assurer l'unicité de la clé primaire et de fournir un accès rapide aux données.