72 votes

Les clés étrangères sont-elles indexées automatiquement dans SQL Server?

L'instruction SQL suivante crée-t-elle automatiquement un index sur Table1.Table1Column ou doit-il être explicitement créé?

Le moteur de base de données est SQL Server 2000

        CREATE TABLE [Table1] (
. . .
            CONSTRAINT [FK_Table1_Table2] FOREIGN KEY 
            (
            	[Table1Column]
            ) REFERENCES [Table2] (
            	[Table2ID]
            )

        )
 

66voto

jons911 Points 1353

SQL Server ne sera pas automatiquement de créer un index sur une clé étrangère. Aussi à partir de MSDN:

Une contrainte de CLÉ ÉTRANGÈRE n'a pas uniquement liés à une CLÉ PRIMAIRE contrainte dans une autre table; il peut également être définie en référence à la les colonnes d'une contrainte UNIQUE dans une autre table. UNE CLÉ ÉTRANGÈRE la contrainte peut contenir des valeurs null; toutefois, si une colonne d'un composite Contrainte de CLÉ ÉTRANGÈRE contient une valeur null les valeurs, la vérification de toutes les valeurs qui composent la CLÉ ÉTRANGÈRE la contrainte est ignorée. Assurez-vous que toutes les valeurs d'un composite ÉTRANGÈRES Contrainte de CLÉ sont vérifiées, spécifiez PAS NUL sur tous les participants les colonnes.

23voto

Charles Bretana Points 59899

Comme je l'ai lu, Mike question, Il est demande si le FK Contrainte de créer un index sur la FK colonne dans la Table de la FK (Table1). La réponse est non, et plus généralement. (pour l'application de la contrainte), il n'est pas nécessaire pour ce faire, Les colonne(s), définie comme la "CIBLE" de la contrainte, d'autre part, doit être un index unique dans la table référencée, soit une Clé Primaire ou d'une autre clé. (index unique) ou le Créer Contrainte de tresorerie échouera.

(EDIT: Ajouté explicitement traité de commentaire ci-dessous -) Plus précisément, lors de la prestation de la cohérence des données qu'une Contrainte de Clé Étrangère est-il pour. un index peut affecter les performances d'un tissu DRI Contrainte uniquement pour les supprime d'une Ligne ou des lignes sur la FK côté. Lors de l'utilisation de la contrainte, lors d'une insertion ou une mise à jour du processeur sait FK de valeur, et doit vérifier l'existence d'une ligne dans la table référencée sur le PK Côté. Il y a déjà un indice. Lors de la suppression d'une ligne sur le PK côté, il doit vérifier qu'il n'y a pas de lignes sur le FK côté. Un index peut être marginalement utile dans ce cas. Mais ce n'est pas un scénario commun.

Autres que que, dans certains types de requêtes, cependant, où le processeur de requête doit trouver les dossiers sur le côté "plusieurs" de une jointure qui utilise cette colonne de clé étrangère. rejoignez le rendement est augmenté lorsqu'il existe un index sur la clé étrangère. Mais cela est propre à l'utilisation de la FK colonne dans une requête de jointure, de ne pas l'existence de la contrainte de Clé étrangère... Il n'a pas d'importance de savoir si de l'autre côté de la jointure est un PK ou les quelques autres arbitraire de la colonne. Aussi, si vous avez besoin de filtrer ou trier les résultats d'une requête sur la base que FK colonne, un index de l'aide... Encore une fois, cela n'a rien à voir avec la contrainte de Clé Étrangère sur cette colonne.

-1voto

Joel Coehoorn Points 190579

Sorte de. Il ne créera pas l'index pour vous, mais cette instruction échouera si l'index n'existe pas déjà.

Donc, non, cela ne créera pas l'index, mais si vous en voyez un, vous pouvez supposer qu'un index existe.

C'est une expérience personnelle. Je ne l'ai pas assez souvent fait pour dire définitivement: "Vous ne pouvez activer aucune option qui annulerait cette information."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X