2010-12-07 23 views
11

Dans SQL Server 2005, j'ai une table avec deux colonnes: parent_id (int) et child id (int). Je veux en faire une clé composite, car je ne veux qu'une seule instance par combinaison possible dans la table.Clé primaire composite et index supplémentaires

La plupart des opérations de recherche seront effectuées sur le champ parent_id, certaines sur le child_id et seulement sporadiques sur les deux champs ensemble.

J'ai prévu de faire un index sur le champ parent_id et peut-être aussi un sur le champ child_id. Est-ce significatif ou est SQL Server 2005 capable d'utiliser la clé primaire composite clusterisée pour les recherches indexées sur une seule colonne (principalement le parent_id) et donc l'index n'est pas nécessaire/dispensable?

Répondre

16

Effectuez la clé primaire composite (parent_id, child_id) pour appliquer l'unicité. SQL Server peut utiliser le composite pour les recherches sur les colonnes ou sur parent_id uniquement, mais il ne peut pas l'utiliser pour les recherches sur child_id uniquement. Si vous en avez besoin, un index séparé sur child_id devra être créé.

+0

Je sais que c'est un vieux message, mais je regarde le même problème. Je ne comprends pas la réponse. Si j'ai une clé composite sur ParentID et ChildID. Comment déterminez-vous qu'il peut "utiliser le composite pour les recherches sur les colonnes ou parent_id uniquement, mais il ne peut pas l'utiliser pour les recherches sur child_id uniquement." "Si vous en avez besoin". ParentID et ChildID sont identiques, alors comment peut-il utiliser l'index composite pour chercher sur l'un mais pas l'autre? – mark1234

+1

@ mark1234: Pensez-y comme une chaîne. Vous ne pouvez pas atteindre le niveau ChildID à moins de passer d'abord par le niveau ParentID. C'est pourquoi les index sur seulement ChildID ne peuvent pas utiliser l'index. Il n'y a aucun filtre ParentID dans la requête pour vous descendre à cet ChildID. –

+0

Merci pour la réponse joe. C'est là que je suis confus. Si elles ne sont que deux ints dans une table, alors pourquoi utiliser un index si je dis "WHERE ParentID = 1 et non" Where ChildID = 1 "Y a-t-il une sorte d'ordinalité dans les colonnes d'un index? J'ai défini composite comme (ChildID, ParentID) des requêtes sur ChildID l'utiliser et ParentID pas? – mark1234