2010-11-12 3 views
4

Tenir compte le tableau suivant dans SQL Server 2008:CLUSTERED vs indice couvrant

LanguageCode varchar(10) 
Language  nvarchar(50) 

LanguageCode participe à des relations, donc je ne peux pas créer un index de clé primaire qui comprend les deux colonnes (LanguageCode, langue).

Si je mets une clé clustered primaire sur LanguageCode, bien sûr, je ne peux pas inclure la langue dans l'index (index de couverture). Cela signifie que je vais devoir créer un deuxième index pour la langue, ou courir le risque d'avoir des doublons dedans (plus forcer un balayage de table pour récupérer sa valeur).

En outre, la documentation de MS (ainsi que des experts en la matière) indiquent qu'un tableau devrait idéalement avoir un index en cluster.

Dans ce cas, un index de couverture non groupé (LanguageCode, Language) garantirait non seulement que la langue est unique, mais éviterait l'analyse de la table. Cependant, il n'y aurait pas d'index clusterisé "idéal".

Est-ce un de ces cas où l'absence d'index clusterisé est idéale?

Modifier en fonction des commentaires:

La seule question que je veux courir est:

SELECT Language, LanguageCode FROM Languages where Language="EN" 
+0

votre table de langue participera-t-elle aux jointures? – Quassnoi

+0

@Quassnoi oui - il se joindra à LanguageCode (correspondant à sa relation) – IamIC

Répondre

6

index cluster, par définition, couvre toutes les colonnes.

Si vous créez un PRIMARY KEY CLUSTERED sur LanguageCode et un UNIQUE INDEX sur Language, il vous permettra de rechercher une langue à la fois par son code et son nom avec une seule recherche, et, en plus, faire Language unique.

+0

@Quassnoi c'est ce que j'ai fait à l'origine. Après votre aide hier, j'ai parcouru une base de données et optimisé ses index.J'essayais de sortir avec 1 index ici puisque en réalité, je vais chercher seulement par Language. – IamIC

+1

@Ian: vous ne pouvez pas utiliser un seul index pour rechercher indépendamment deux colonnes différentes. Un index repose sur le tri, et vous ne pouvez pas trier sur deux colonnes à la fois. – Quassnoi

+1

@Ian: recherche sur 'Language' ou recherche et jointure sur' Language'? Comme 'LanguageCode' est référencé par les clés étrangères, il semble que vous voudrez vous y joindre également. – Quassnoi

4
  1. Il n'est pas nécessaire d'inclure des colonnes sur un index clusterisé. Puisque l'index clusterisé est "les données", toutes les colonnes sont automatiquement incluses.

  2. Si vous avez besoin d'effectuer une recherche par Langue et/ou de vous assurer de son unicité, alors créez un index supplémentaire.

+0

merci - je vois votre point re. l'index clusterisé étant les données. J'ai regardé le système de stockage de SQL Server. En note, je me demande combien de bases de données cela vaut pour. – IamIC

+0

@IanC: c'est vrai pour toutes les bases de données qui supportent les index clusterisés. Parmi les plus importants, il y a 'SQL Server',' Oracle' (qui l'appelle * table organisée par index *) et 'InnoDB' (l'un des moteurs de stockage' MySQL'). – Quassnoi

+0

@Quassnoi Qu'en est-il de PostgreSQL? Je sais que Caché utilise un système différent. C'est toujours mon préféré. DB, en dehors de l'étiquette de prix. – IamIC

0

Sur la base de la nature du sujet (que je devine est langues parlées par les humains), l'indexation pour la performance va être hors de propos. Si vous aviez 100 langues et que chaque ligne prenait 120 octets (pseudo-factorisation dans les en-têtes varchar, les masques de bits null et autres joyeusetés), vous auriez 12 000 octets de données, ce qui correspond à deux pages de 8 ko. SQL ne prendra pas la peine d'utiliser des index sur quoi que ce soit de si petit, il va simplement numériser le tout (2 pages) et le forcer brutalement, en demandant moins de temps que ce que l'on peut facilement mesurer.

Indexation pour assurer l'unicité, bien sûr, je le fais tout le temps. Mais pour la performance, jusqu'à ce que vous atteignez 3 pages (ou 4), cela n'a pas d'importance. (Ce qui se passera si vous suivez les langages de programmation, car il y en a une douzaine de nouvelles chaque semaine.)

+2

cela dépend totalement des requêtes que @op utilisera. Voir ici: http://explainextended.com/2009/06/22/indexing-tiny-tables/ – Quassnoi