Par défaut, le PK est mis en cluster et dans la plupart des cas, c'est très bien. Cependant, quelle question devrait être posée:
- mon PK doit-il être mis en cluster?
- quelle (s) colonne (s) sera la meilleure clé pour mon index clusterisé?
PK et l'index cluster sont deux choses différentes:
- PK est une contrainte. PK est utilisé pour identifier de manière unique les lignes, mais il n'y a aucune notion de stockage. Cependant, par défaut (dans SSMS), il est appliqué par un index cluster unique si un index cluster n'est pas encore présent.
- Les index clusterisés sont un type spécial d'index qui stocke les données de ligne au niveau feuille, ce qui signifie qu'il est toujours couvrant. Toutes les colonnes, qu'elles fassent partie ou non de la clé, sont stockées au niveau feuille. Il n'est pas nécessaire qu'il soit unique, auquel cas un unificateur (4 octets) est ajouté à la clé en cluster.
Maintenant, nous nous retrouvons avec 2 questions:
- Comment puis-je identifier de façon unique les lignes de ma table (PK)
- Comment puis-je le stocker au niveau feuille d'un index (Clustered Index)
Cela dépend de la façon dont:
- vous concevez votre modèle de données
- vous interrogez vos données et vous écrivez vos requêtes
- vous insérez ou mettez à jour vos données
- ...
Tout d'abord, avez-vous besoin d'un index clusterisé? Si vous insérez en bloc, il est plus efficace de stocker des données non ordonnées dans un HEAP (par rapport aux données ordonnées dans un cluster). Il utilise le RID (Row Identifier, 8 octets) pour identifier de manière unique les lignes et les stocker sur des pages.
L'index cluster ne doit pas être une valeur aléatoire. Les données au niveau feuille seront stockées et ordonnées par la clé d'index. Par conséquent, il doit croître en permanence afin d'éviter la fragmentation ou le fractionnement de page. Si cela ne peut pas être réalisé par le PK, vous devez envisager une autre clé en tant que candidat en cluster. Un index clusterisé sur des colonnes d'identy, un GUID séquentiel ou même quelque chose comme la date de l'insertion est très bien d'un point de vue séquentiel puisque toutes les lignes seront ajoutées à la dernière page feuille. D'un autre côté, bien qu'un identifiant unique puisse être utile aux besoins de votre entreprise en tant que PK, il ne doit pas être mis en cluster (il est commandé / généré de manière aléatoire).
Si, après quelques analyses de données et de requêtes, vous découvrez que vous utilisez principalement le même index pour obtenir vos données avant d'effectuer une recherche de clé dans le PK en cluster, vous pouvez le considérer comme un index en cluster bien qu'il ne puisse pas identifier de manière unique vos données.
La clé d'index cluster est composée de toutes les colonnes que vous souhaitez indexer. Une colonne uniquefier (4 octets) est ajoutée s'il n'y a pas de contrainte unique (valeur incrémentielle pour les doublons, null sinon). Cette clé d'index sera ensuite stockée une fois pour chaque ligne au niveau feuille de tous vos index non cluster. Certains d'entre eux seront également stockés plusieurs fois à des niveaux intermédiaires (branche) entre la racine et le niveau feuille de l'arbre d'index (arbre B). Si la clé est trop grande, tout l'index non clusterisé s'agrandira, nécessitera plus de stockage et plus d'E / S, CPU, mémoire, ... Si vous avez un PK sur nom + date de naissance + pays, il est très probable que cette clé n'est pas un bon candidat. Il est trop grand pour un index clusterisé. Uniqueidentifier utilisant NEWSEQUENTIALID () n'est généralement pas considéré comme une clé étroite (16 octets) bien qu'il soit séquentiel.
Ensuite, une fois que vous avez compris comment identifier de manière unique les lignes de votre tableau, vous pouvez ajouter un PK. Si vous pensez que vous ne l’utiliserez pas dans votre requête, ne le créez pas en cluster. Vous pouvez toujours créer un autre index non cluster si vous avez parfois besoin de l'interroger. Notez que le PK créera automatiquement un index unique.
Les index non clusterisés contiendront toujours la clé clusterisée. Cependant, si les colonnes indexées (+ colonnes clés) couvrent, il n'y aura pas de recherche de clé dans l'index clusterisé. N'oubliez pas que vous pouvez également ajouter Inclure et Où à un index non cluster. (fais-en bon usage)
L'index cluster doit être unique et aussi étroit que possible. L'index cluster ne doit pas changer avec le temps et doit être inséré de manière incrémentielle.
Il est maintenant temps d'écrire du SQL qui créera la table, les index et les contraintes en cluster et non-cluster.
Tout cela est théorique car nous ne connaissons pas votre modèle de données et les types de données utilisés (A et B).