2010-09-06 6 views

risposta

35

Ogni chiave esterna? No. Quando la selettività è bassa (cioè molti valori sono duplicati), un indice può essere più costoso di una scansione di tabella. Inoltre, in un ambiente ad alta attività (molto più attività di inserimento/aggiornamento/eliminazione che query) il costo di mantenimento degli indici può influire sulle prestazioni generali del sistema.

+1

OK. Quindi c'è qualche limite numerico o soglia che può innescare la creazione di un indice? – GRGodoi

11

Il motivo per l'indicizzazione di una colonna di chiave esterna è lo stesso del motivo per l'indicizzazione di qualsiasi altra colonna: creare un indice se si intende filtrare le righe in base alla colonna.

Ad esempio, se si ha tabella [Utente] (ID int, Nome varchar (50)) e tabella [UserAction] (UserID int, Azione varchar (50)) si vorrà molto probabilmente riuscire a trovare cosa azioni fatte da un particolare utente. Ad esempio, si sta per eseguire la seguente query:

select ActionName from [UserAction] where UserID = @UserID 

Se non si intende per filtrare le righe in base alla colonna allora non c'è bisogno di mettere un indice su di esso. E anche se lo fai, ne vale la pena solo se hai più di 20 - 30 righe.

+0

Sei sicuro che l'indice non sarà utile durante la convalida della chiave esterna quando eseguo un inserto su UserAction? – GRGodoi

+1

No. La convalida viene eseguita rispetto alla tabella e alla colonna che contiene la chiave primaria o il vincolo univoco (ad es. [Utente]. [ID]). Non è necessario convalidare la colonna UserID della tabella [UserAction]. È possibile fare riferimento solo a una colonna che ha una chiave primaria o un vincolo univoco su di essa in modo che sia sempre indicizzata. – ItsMe

+2

L'altra azione da considerare è l'eliminazione di righe da 'Utente', che fa sì che il motore cerchi le righe in' UserAction' basate su 'UserID'. –

5

Da MSDN: FOREIGN KEY Constraints

Creazione di un indice in una chiave esterna è spesso utile per i seguenti motivi:

  • modifiche per vincoli PRIMARY KEY vengono controllati con i vincoli di chiave esterna nella tabelle correlate.
  • Le colonne chiave esterna vengono utilizzate frequentemente nei criteri di join quando i dati delle tabelle correlate vengono combinati nelle query facendo corrispondere la colonna o le colonne nel vincolo FOREIGN KEY di una tabella con la colonna o le colonne chiave primaria o univoca nell'altra tabella.
Problemi correlati