Création d'index non-cluster

Vous pouvez créer plusieurs index non-cluster sur une table ou une vue indexée. Généralement, les index non-cluster sont créés pour améliorer les performances des requêtes récurrentes non couvertes par l'index cluster.

Mises en œuvre classiques

Les index non-cluster sont mis en œuvre comme ceci :

  • 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 contenir 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 la table n'a pas encore d'index cluster. Pour plus d'informations, consultez Contraintes PRIMARY KEY et Contraintes UNIQUE.

  • Index indépendant d'une contrainte

    Par défaut, un index non-cluster est créé si l'option CLUSTERED n'est pas spécifiée. Le nombre maximal d'index non cluster pouvant être créés par table est de 999. Cela inclut tous les index créés par des contraintes PRIMARY KEY ou UNIQUE, mais pas les index XML.

  • Index non-cluster sur une vue indexée

    Une fois qu'un index cluster unique a été créé sur une vue, vous pouvez créer des index non-cluster. Pour plus d'informations, consultez Création de vues indexées.

Index avec colonnes incluses

Lorsque vous créez un index non-cluster pour les besoins d'une requête, vous pouvez inclure des colonnes non clés dans la définition de l'index afin de couvrir les colonnes qui, dans la requête, ne sont pas utilisées comme colonnes de recherche principales. Cette méthode améliore les performances car elle permet à l'optimiseur de requête de retrouver toutes les données dont il a besoin dans l'index, sans devoir accéder à la table ou à l'index cluster. Pour plus d'informations, consultez Index avec colonnes incluses.

Index avec un prédicat de filtre

Un index filtré est un index non cluster optimisé, convenant tout particulièrement aux requêtes qui effectuent des sélections dans un sous-ensemble de données bien défini. Il utilise un prédicat de filtre pour indexer une partie des lignes de la table. Un index filtré bien conçu peut améliorer les performances des requêtes, réduire les coûts de maintenance des index et réduire les coûts de stockage des index par rapport aux index de table entière.

Pour plus d'informations, consultez Règles de conception d'index filtrés.

Espace disque nécessaire

Pour plus d'informations sur l'espace disque nécessaire pour les index non cluster, consultez Détermination de l'espace disque requis par les index.

Considérations relatives aux performances

Bien qu'il soit important que l'index contienne toutes les colonnes utilisées par la requête, évitez d'ajouter des colonnes sans raison. Un nombre trop élevé de colonnes d'index, clés et non-clés, peut avoir un impact négatif en termes de performances :

  • Moins de lignes d'index par page, augmentation des E/S disque et perte d'efficacité du cache.

  • Plus d'espace disque nécessaire pour stocker l'index.

  • La maintenance de l'index peut augmenter le temps nécessaire pour effectuer des modifications, des insertions, des mises à jour, des suppressions ou des fusions dans la table ou la vue indexée sous-jacente.

Avant de créer un index non-cluster, vérifiez que les avantages qu'il vous apporte (requêtes plus performantes) compensent les pertes de performances qu'il suppose (modifications plus difficiles et espace disque nécessaire plus important). Pour plus d'informations sur l'évaluation des performances des requêtes, consultez Analyse de requêtes.

Envisagez d'utiliser un index filtré pour améliorer les performance lorsque les données de table ont des colonnes avec des sous-ensembles de lignes bien définis, par exemple des colonnes fragmentées, des colonnes contenant principalement des valeurs NULL, des colonnes avec des catégories de valeurs et des colonnes avec des plages de valeurs distinctes. Pour plus d'informations, consultez Règles de conception d'index filtrés.

Pour créer une contrainte PRIMARY KEY ou UNIQUE au moment de la création d'une table

CREATE TABLE (Transact-SQL)

Pour créer une contrainte PRIMARY KEY ou UNIQUE sur une table existante

ALTER TABLE (Transact-SQL)

Pour créer un index

CREATE INDEX (Transact-SQL)