Supponiamo di avere 2 tabelle, prodotti e categorie di prodotti. Entrambe le tabelle hanno una relazione su CategoryId. E questa è la domanda.La chiave esterna migliora le prestazioni della query?
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 il piano di esecuzione, tabella ProductCategories esegue ricerca indice cluster, che è come aspettativa. Ma per i prodotti da tavola, 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 l'indice su Products.CategoryId. Quando creo di nuovo il piano di esecuzione, entrambe le tabelle eseguono la ricerca dell'indice. E il costo del sottostrato stimato viene ridotto molto.
Le mie domande sono:
Accanto FK aiuta il vincolo rapporto, Ha qualche altra utilità? Migliora le prestazioni della query?
Devo creare un indice su tutte le colonne FK (Prodotti Prodotti.CategoryId) in tutte le tabelle?
+1: il modello è una cosa. La performance è un'altra. –
I buoni modelli (generalmente) hanno prestazioni migliori. –
"Le chiavi esterne sono uno strumento di integrità relazionale": si prega di utilizzare la parola "relazionale" con attenzione. Le chiavi esterne sono un concetto di database, una mano breve per un vincolo di integrità referenziale. Non fanno parte del modello relazionale. Immagino tu abbia fatto un refuso. – onedaywhen