On m'a dit que si j'utilise une clé étrangère pour deux tables, le serveur SQL créera quelque chose de semblable à un index dans la table enfant. J'ai du mal à croire que cela soit vrai, mais je ne trouve pas grand-chose de spécifique à ce sujet.
Si je vous pose cette question, c'est parce que le temps de réponse d'une instruction de suppression d'une table qui comporte probablement 15 tables connexes est très lent. J'ai demandé à notre responsable de la base de données et il m'a répondu que s'il existe une clé étrangère sur les champs, elle agit comme un index. Quelle est votre expérience à ce sujet ? Devrais-je ajouter des index sur tous les champs de clé étrangère ou bien s'agit-il simplement d'une surcharge inutile ?
0 votes
J'ai la même compréhension que votre responsable de la base de données - que les FKs créent en fait un index.
13 votes
Non - un FK le fait PAS créer automatiquement un index. Il est logique d'en créer un - mais c'est PAS fait automatiquement par le serveur SQL.
55 votes
Ce n'est pas du tout idiot de demander cela !
0 votes
Après avoir vu certaines des réponses, je suppose que tu as raison. Il y a un peu de confusion à ce sujet. Merci à tous !
6 votes
Si vous obtenez des suppressions lentes et que la table que vous supprimez est référencée par d'autres tables, vous obtiendrez probablement un gain de performance en indexant les clés étrangères dans le fichier autre tables. En effet, lorsque SQL supprime une ligne, il doit vérifier l'intégrité référentielle de cette ligne. Pour ce faire, il doit évidemment vérifier qu'il n'existe aucune autre ligne faisant référence à la ligne que vous supprimez.
0 votes
* S'il n'y a pas d'index sur la clé étrangère, il faudra effectuer un balayage de la table pour rechercher des références au PK de la ligne que vous essayez de supprimer. J'espère que cela a du sens. Essayez peut-être de demander à votre responsable de la base de données d'examiner le plan d'exécution de la requête pour la suppression. Il sera peut-être en mesure de déterminer que le ralentissement est dû à ce problème.
0 votes
@Noel - Je me dirige dans cette direction au moment où vous lisez ceci ;)
3 votes
Je dirais qu'un gars de la base de données qui ne sait pas ça doit avoir un sérieux besoin de formation. Les gens de la base de données sont responsables des performances, c'est leur travail de connaître ce genre de choses. Cela suggère une incompétence flagrante.
0 votes
Wow. J'ai toujours pensé que l'ajout d'un FK ajoutait également un index implicite à la table enfant. Je sais que j'ai déjà lu cela auparavant. Et je sais que MySQL et quelques autres BD avec lesquelles j'ai travaillé dans le passé le font. Cela a bouleversé mon monde.
0 votes
Oui, il semble que MySQL le fasse : stackoverflow.com/questions/304317/