Création d'index cluster
À quelques exceptions près, chaque table doit posséder un index cluster. Outre le fait qu'il améliore les performances des requêtes, un index cluster peut être regénéré ou réorganisé à la demande pour contrôler la fragmentation de la table. Un index cluster peut également être créé sur une vue.
Implémentations courantes
Les index cluster sont implémentés des manières suivantes :
Contraintes PRIMARY KEY et UNIQUE
Lorsque vous créez une contrainte PRIMARY KEY, un index cluster unique est automatiquement généré sur la ou les colonnes si aucun index cluster n'existe déjà sur la table et que vous ne spécifiez pas un index non-cluster unique. La colonne de clé primaire ne peut pas autoriser de valeurs NULL.
Lorsque vous créez une contrainte UNIQUE, un index non-cluster unique est créé pour appliquer par défaut une contrainte UNIQUE. Vous pouvez spécifier un index cluster unique si aucun index cluster n'existe déjà sur la table.
Un index créé dans le cadre de la contrainte reçoit automatiquement le nom de celle-ci. Pour plus d'informations, consultez Contraintes PRIMARY KEY et Contraintes UNIQUE.
Index indépendant d'une contrainte
Vous pouvez créer un index cluster sur une autre colonne que la colonne de clé primaire si une contrainte de clé primaire non-cluster a été spécifiée.
Vue indexée
Pour créer une vue indexée, vous devez définir un index cluster unique sur une ou plusieurs colonnes de vue. La vue est matérialisée et le jeu des résultats est stocké au niveau feuille de l'index de la même manière que les données de table sont stockées dans un index cluster. Pour plus d'informations, consultez Création de vues indexées.
Sélection des colonnes clés
Étant donné qu'une table ne peut posséder qu'un seul index cluster, il est très important de déterminer les colonnes sur lesquelles créer celui-ci. Pour plus d'informations sur la sélection de la colonne adéquate, consultez Indications pour la conception d'index cluster.
La clé d'un index cluster ne peut pas contenir de colonnes varchar qui possèdent des données dans l'unité d'allocation ROW_OVERFLOW_DATA. Si un index cluster est créé sur une colonne varchar et que les données existantes se trouvent dans l'unité d'allocation IN_ROW_DATA, les actions d'insertion ou de mise à jour réalisées ultérieurement sur la colonne et susceptibles d'envoyer les données hors ligne sont vouées à l'échec. Pour plus d'informations sur les unités d'allocation, consultez Organisation des tables et des index.
Espace disque requis
Lorsqu'une structure d'index cluster est créée, l'ancienne structure (source) et la nouvelle structure (cible) requièrent de l'espace disque dans leurs fichiers et groupes de fichiers respectifs. L'ancienne structure n'est désallouée qu'une fois l'ensemble de la transaction validé. Il est également possible qu'une opération de tri nécessite de l'espace disque temporaire supplémentaire. Pour plus d'informations, consultez Détermination de l'espace disque requis par les index.
Considérations relatives aux performances
Si un index cluster est créé sur un segment comprenant plusieurs index non-cluster, ces derniers doivent tous être reconstruits afin qu'ils contiennent la valeur de clé de cluster au lieu de l'identificateur de ligne (RID). De même, si un index cluster est supprimé d'une table comprenant plusieurs index non-cluster, ces derniers sont tous regénérés pendant l'opération de suppression (DROP). Cette opération peut prendre beaucoup de temps sur les tables volumineuses.
Il est préférable de construire des index sur des tables volumineuses en commençant par l'index cluster, puis de poursuivre avec les index non-cluster. Pensez à attribuer la valeur ON à l'option ONLINE lorsque vous créez des index sur des tables existantes. Lorsque cette option a pour valeur ON, les verrous de table à long terme ne sont pas maintenus. Ce paramétrage permet de poursuivre les interrogations ou les mises à jour de la table sous-jacente. Pour plus d'informations, consultez Exécution d'opérations en ligne sur les index.