2009-12-11 13 views
2

La cardinalité joue-t-elle un rôle dans les index composites? Si oui, quoi?Stratégies concernant les index composites et la cardinalité

je courais une requête qui unissait sur deux colonnes et utilisé ce que je pensais être un indice de sup-optimal, il me fait repenser la façon dont je conçois les index ...

Disons que nous avions un tableau qui répertorie toutes les villes aux États-Unis. Mon premier instinct est là pour faire un index ordonné en clusters sur (État ->Ville) de sorte que si jamais nous avons besoin d'interroger tous les Villes pour un Etat , il serait probablement cibler cet indice. En outre, il serait un bon indice pour les requêtes qui spécifient à la fois Ville et État (ici, nous pouvons supposer que Ville, État est une paire unique).

J'ai couru dans une requête qui se joint essentiellement d'une table qui a donné une liste de villes spéciales. Il s'agit donc d'un sous-ensemble de la table Cities. Je spécifie la jointure sur Special.City et Special.State, mais ce qui m'a surpris ici, c'est qu'il a utilisé l'index de clé primaire (créé automatiquement par le serveur SQL) de la table Cities au lieu de l'index cluster J'ai fait. Comment venir?

J'ai aussi entendu dire que de bons indices ont une grande cardinalité ...

Je me demande si l'index ordonné en clusters (ou un autre, l'indice distinct) aurait dû être créé (Ville -> État) (Notez la différence dans l'ordre) parce que (nous supposons) juste Ville a cardinalité élevée et est beaucoup plus discriminante que L'état est dans la première série de seaux. Cela a toujours été ma règle de toujours créer des index cluster sur parent-> child dans les relations parent-enfant, comme dans Cities and States, pour bénéficier des requêtes qui ciblent des enfants spécifiques et des requêtes qui récupèrent tous les enfants pour un parent donné. Dois-je repenser quelque chose ici?

test informel montre qu'un index (Ville ->State) a été légèrement moins cher que l'indice PK.

Répondre

1

Quelques réflexions:

  • Lorsque vous avez rejoint sur « Villes spéciales », avez-vous demandé pour toutes les colonnes ou tout simplement la ville et de l'Etat de « City »?C'est-à-dire, ce qu'il a couvert

  • Quel est l'indice ou l'ordre PK pour "Special Cities"?

  • Avez-vous filtré où vous voulez?

La cardinalité de la colonne peut jouer un rôle si: voir Craig Freedman's blog entry pour les recherches résiduelles. Et another one.

Et il est mentionné dans BOL (ne peut pas trouver si) qu'il devrait être plus sélectif premier

Cependant, cela tombe en dehors où vous utilisez plusieurs couches de tables et des clés composites. Exemple:

  • Table Grandad (GrandDadID, ...)
  • Table Papa (GrandDadID, DadID, ...)
  • Table Son (GrandDadID, DadID, SonID, ...)

PK for Son couvre les besoins en FK pour les deux tables parentes.

Si vous inversez cet ordre pour "Dad" et "Son" car DadID et SonID doivent être sélectifs puis GrandDadID, vous avez soudainement besoin de beaucoup plus d'index pour couvrir les requêtes et FK DRI.

donc: cardinalité colonne joue un rôle, mais il est juste un facteur et, euh, « ça dépend » ...

+0

C'est hilarant! Ce gars a un blog entier dédié à l'indexation? C'est fou. Merci beaucoup! –

+0

@Mark: pas seulement les index. Lisez ce qu'il a fait: http://blogs.msdn.com/craigfr/about.aspx – gbn

+0

Dans votre exemple, Son.GrandDadID n'est-il pas implicite dans la relation donnée par DadID? –

0

Le type d'indexation que vous traitez (par opposition aux PK de munchkin sur les clés de substitution d'identité) peut être une boîte de Pandore. On pourrait écrire sur le sujet pendant des heures, et ne pas nécessairement dire n'importe quoi qui pourrait vous aider dans votre situation. Lire des articles sur l'indexation et faire beaucoup d'expérimentation pourrait être votre meilleur pari.

Pas beaucoup d'aide, hélas. Je pourrais le mettre à jour plus tard, si je peux penser à des truismes universels concis.

Questions connexes