Supponiamo di avere 2 tabelle, prodotti e categorie di prodotti. Entrambe le tabelle hanno una relazione su CategoryId. E questa è la domanda.
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;
Quando creo un piano di esecuzione, la tabella ProductCategories esegue la ricerca dell'indice del cluster, che è come aspettativa. Ma per i prodotti da tavolo, esegue la scansione dell'indice del cluster, il che mi fa dubitare. Perché FK non aiuta a migliorare le prestazioni delle query?
Quindi devo creare un indice su Products.CategoryId. Quando creo nuovamente il piano di esecuzione, entrambe le tabelle eseguono la ricerca dell'indice. E il costo stimato della sottostruttura è molto ridotto.
Le mie domande sono:
Oltre a FK aiuta a limitare le relazioni, ha qualche altra utilità? Migliora le prestazioni delle query?
Devo creare un indice su tutte le colonne FK (mi piace Products.CategoryId) in tutte le tabelle?