Forum aux questions sur SQLIndex non cluster et conservation des autorisations

Saleem Hakani and Dan Carollo

Index non cluster et leurs utilisations

Q Que sont les index non cluster et quels sont les avantages et les inconvénients de leur utilisation ?

R Un index non cluster ressemble au type d'index que l'on trouve en général à la fin d'un livre. Toutes les informations contenues dans le livre sont représentées par sujet dans l'index et des pointeurs sous forme de numéros de page qui vous dirigent vers l'information, éventuellement à plusieurs emplacements différents du livre. De plus, les données dans l'index d'un livre ne sont pas répertoriées dans le même ordre que dans le texte du livre. C'est la même chose avec les index non cluster. Si vous avez un index cluster dans une table, vous pouvez spécifier quel sera l'ordre des éléments. Sinon, il n'y a pas de façon d'être certain de ce que sera l'ordre.

De plus, les index non cluster ont deux limites : l'index ne peut contenir que 16 colonnes et la taille maximale de la clé d'index ne peut pas dépasser 900 octets. Qu’est-ce que cela signifie ? Voyons ce qui se passe si vous voulez indexer les colonnes suivantes dans la table Movie de l'exemple de base de données MovieList : MovieTitle NVarchar(50), DirectorName NVarchar(50), ShortStory NVarchar(400).

Supposons que vous générez l'instruction suivante pour créer la table :

Use MovieList;
CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName, ShortStory); 

Celle-ci génèrera le message d'erreur suivant : « Avertissement ! La longueur de clé maximale est 900 octets. L'index 'Movie_IDX' a une longueur maximale de 1000 octets. Dans certains cas, la combinaison de valeurs élevées entraînera l'échec de l'opération d'insertion/mise à jour. Vous recevrez le message mentionné ci-dessus parce que le type de données « nvarchar » consomme 2 octets par caractère ; un index qui contient les trois colonnes précédentes dépasserait la taille maximale de 900 octets.

Grâce à SQL Server® 2005, vous avez la possibilité de surmonter ce problème en ajoutant les colonnes à la clause INCLUDE. Il s'agit d'une fonctionnalité très utile si vous voulez contourner à la fois les restrictions de taille et de colonne. Vous pouvez le faire en exécutant l'instruction suivante :

CREATE INDEX Movie_IDX ON Movie(MovieTitle, DirectorName) INCLUDE (ShortStory);

Il est important de noter que lorsque vous utilisez la clause INCLUDE pendant une création d'index, le moteur de la base de données ne prend pas en compte les colonnes non clés lors du calcul du nombre de colonnes clés ou la taille des clés de l'index.

Pour plus d'informations sur les index non cluster, consultez les articles « Index non cluster » à l'adresse msdn2.microsoft.com/aa174537 et « Utilisation des index non cluster » à l'adresse msdn2.microsoft.com/aa933130. Pour obtenir des conseils sur l'optimisation des index, consultez la page sql-server-performance.com/optimizing_ indexes.asp.

Conservation des données d'autorisation

Q Comment puis-je éviter de perdre les autorisations lorsqu'un abonnement est réinitialisé ? J'ai connu plusieurs fois le problème suivant : lorsqu'un instantané est réinitialisé, il perd toutes les autorisations accordées.

R Par défaut, tous les objets de la base de données d'abonnement sont supprimés et recréés lorsqu'un abonnement est réinitialisé. Mais il y a deux façons de gérer ce scénario.

Tout d'abord, vous pouvez réappliquer toutes les autorisations après la réinitialisation. Lorsque vous définissez les autorisations manuellement, vous devez scripter toutes les autorisations objet/niveau d'instruction et les stocker séparément afin de pouvoir les utiliser immédiatement après avoir réinitialisé l'abonnement.

Ensuite, vous pouvez configurer votre abonnement pour qu'il ne supprime aucun objet lorsque vous le réinitialisez. Pour cela, vous pouvez utiliser la procédure stockée système SP_CHANGEARTICLE pour configurer la valeur PRE_CREATION_CMD pour le paramètre @PROPERTY et une valeur NONE, DELETE ou TRUNCATE pour le paramètre @Value.

De même, dans la boîte de dialogue Propriétés de l'article dans la section des objets de destination, sélectionnez la valeur « Conserver l'objet existant inchangé, supprimer uniquement les données. Si l'article possède un filtre de rang, supprimer uniquement ce qui correspond au filtre. Tronquer toutes les données dans l'objet existant ». Veillez à tester ceci dans votre environnement de test et si vous avez besoin d'aide supplémentaire, consultez la dernière version de la documentation SQL Server en ligne pour obtenir les informations les plus récentes.

Saleem Hakani est ingénieur bases de données senior, ingénieur senior en résolution de problèmes et responsable de la communauté mondiale Microsoft SQL Server avec 14 années d'expérience dans les systèmes de bases de données. Il dirige le site Web externe de la communauté SQL Server sqlcommunity.com et peut être contacté à l'adresse Saleem@sqlcommunity.com.

Dan Carollo est un ingénieur d'exploitation et administrateur de bases de données SQL Server qui travaille avec l'équipe Windows Anti-Malware Research and Response de Microsoft. Il possède un MCT en SQL Server.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.