Supposons que j'ai deux tables, Products et ProductCategories. Les deux tables ont une relation sur CategoryId. Et voici la requête.
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 le plan d'exécution, la table ProductCategories effectue une recherche d'index en grappe, ce qui est conforme aux attentes. Mais pour la table Products, elle effectue un scan de l'index en cluster, ce qui me fait douter. Pourquoi FK n'aide-t-il 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é des sous-arbres est considérablement réduit.
Mes questions sont les suivantes :
-
Outre le fait que FK aide à résoudre les contraintes relationnelles, a-t-il une autre utilité ? Améliore-t-elle les performances des requêtes ?
-
Dois-je créer un index sur toutes les colonnes FK (comme Products.CategoryId) dans toutes les tables ?