Supposons que j'ai 2 tables, produits et catégories de produits. Les deux tables ont une relation sur CategoryId. Et c'est la question.
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
Lorsque je crée un plan d'exécution, la table ProductCategories effectue une recherche d'index de cluster, ce qui est attendu. Mais pour les produits de table, il effectue une analyse d'index de cluster, ce qui me fait douter. Pourquoi FK n'aide pas à améliorer les performances des requêtes?
Je dois donc créer un index sur Products.CategoryId. Lorsque je crée à nouveau le plan d'exécution, les deux tables effectuent une recherche d'index. Et le coût estimé du sous-arbre est considérablement réduit.
Mes questions sont:
A côté de FK aide sur la contrainte relationnelle, a-t-il une autre utilité? Améliore-t-il les performances des requêtes?
Dois-je créer un index sur toutes les colonnes FK (comme Products.CategoryId) dans toutes les tables?
la source
Les clés étrangères peuvent améliorer (et nuire) les performances
Comme indiqué ici: les clés étrangères améliorent les performances
Vous devez toujours créer des index sur les colonnes FK pour réduire les recherches. SQL Server ne le fait pas automatiquement.
Éditer
Comme le lien semble maintenant mort (bravo à Chris pour l'avoir remarqué) , ce qui suit montre l'essentiel des raisons pour lesquelles les clés étrangères peuvent améliorer (et nuire) les performances.
La clé étrangère peut-elle améliorer les performances
la source
Une clé étrangère est un concept de SGBD pour garantir l'intégrité de la base de données.
Toutes les implications / améliorations de performances seront spécifiques à la technologie de base de données utilisée et sont secondaires par rapport à l'objectif d'une clé étrangère.
Il est recommandé dans SQL Server de s'assurer que toutes les clés étrangères ont au moins un index non clusterisé sur elles.
J'espère que cela clarifie les choses pour vous, mais n'hésitez pas à demander plus de détails.
la source
Votre meilleur pari de performance est d'utiliser des index sur les champs que vous utilisez fréquemment. Si vous utilisez SQL Server, vous pouvez utiliser le profileur pour profiler une base de données spécifique et prendre le fichier qui génère et utiliser l'assistant de réglage pour recevoir des recommandations sur l'emplacement de vos index. J'aime aussi utiliser le profiler pour éliminer les procédures stockées de longue durée, j'ai une liste des dix pires contrevenants que je publie chaque semaine, pour que les gens restent honnêtes: D.
la source
Vous pouvez l'utiliser pour rendre une requête plus efficace. Il vous permet de restructurer les requêtes dans SQL Server pour utiliser une jointure externe au lieu d'une jointure interne, ce qui supprime la nécessité pour les serveurs SQL de vérifier s'il y a une valeur nulle dans la colonne. Vous n'avez pas besoin de mettre ce qualificatif car la relation de clé étrangère l'informe déjà pour vous.
Donc ça:
Devient ceci:
Cela n'entraînera pas nécessairement d'énormes performances dans les petites requêtes, mais lorsque les tables deviennent volumineuses, cela peut être plus efficace.
la source
Pour MySQL 5.7, il peut certainement accélérer les requêtes impliquant plusieurs jointures incroyablement bien!
J'ai utilisé «expliquer» pour comprendre ma requête et j'ai trouvé que je rejoignais 4 à 5 tables - où aucune clé n'était utilisée du tout. Je n'ai rien fait d'autre que d'ajouter une clé étrangère à ces tables et le résultat a été une réduction de 90% du temps de chargement. Les requêtes qui prenaient plus de 5 secondes prennent désormais 500 ms ou moins.
C'est une amélioration ÉNORME!
ET, comme d'autres l'ont mentionné, vous obtenez l'avantage supplémentaire d'assurer l'intégrité relationnelle.
Au-delà de cela, garantir l'intégrité référentielle a également ses propres avantages en termes de performances. Il a pour effet de second ordre de garantir que les tables qui ont la clé étrangère sont «à jour» avec la table étrangère. Supposons que vous ayez une table des utilisateurs et une table des commentaires, et que vous fassiez des statistiques sur la table des commentaires. Probablement si vous supprimez définitivement l'utilisateur, vous ne voulez plus ses commentaires non plus.
la source
L'ajout d'une clé étrangère dans la table n'améliorera pas les performances, il suffit de dire que si vous insérez un enregistrement dans une base de données de table ProductCategories essaiera de trouver que la colonne de clé étrangère a une valeur qui existe dans la valeur de clé primaire d'une table products, cette recherche, l'opération est une surcharge sur votre base de données chaque fois que vous ajoutez une nouvelle entrée dans la table ProductCategories. Ainsi, l'ajout d'une clé étrangère n'améliorera pas les performances de votre base de données mais prendra soin de l'intégrité de votre base de données. Oui, cela améliorera les performances de votre base de données si vous vérifiez l'intégrité à l'aide d'une clé étrangère au lieu d'exécuter de nombreuses requêtes pour vérifier que l'enregistrement existe dans la base de données de votre programme.
la source
Je ne sais pas grand-chose sur le serveur SQL, mais dans le cas d'Oracle, avoir une colonne de clé étrangère réduit les performances de chargement des données. En effet, la base de données doit vérifier l'intégrité des données pour chaque insertion. Et oui, comme il est déjà mentionné, avoir un index sur la colonne de clé étrangère est une bonne pratique.
la source
À partir de SQL Server 2008, les clés étrangères peuvent influencer les performances en influençant la façon dont le moteur de base de données choisit d'optimiser la requête. Reportez-vous à Star Join Heuristics dans l'article suivant: https://technet.microsoft.com/en-us/library/2008.04.dwperformance.aspx
la source