È buona prassi creare un indice per ogni chiave esterna in un database SQL Server?Ogni chiave esterna di SQL Server deve avere un indice di corrispondenza?
risposta
Sì, è una buona pratica, vedere qui: When did SQL Server stop putting indexes on Foreign Key columns? scorrere verso il basso allo Ci sono dei vantaggi nell'indicizzare le colonne di chiavi esterne? sezione
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.
OK. Quindi c'è qualche limite numerico o soglia che può innescare la creazione di un indice? – GRGodoi
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.
Sei sicuro che l'indice non sarà utile durante la convalida della chiave esterna quando eseguo un inserto su UserAction? – GRGodoi
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
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'. –
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.
- 1. Script per aggiungere un indice su ogni chiave esterna?
- 2. Ogni voce del dizionario deve avere un attributo chiave associata
- 3. Indice chiave univoco su SQL Server 2008
- 4. Elimina dati con chiave esterna nella tabella di SQL Server
- 5. Come rimuovere il vincolo di chiave esterna in sql server?
- 6. È errato avere "ridondanza di chiave esterna" in un database?
- 7. chiave composita come chiave esterna (SQL)
- 8. SQL Server 2008: trovare la chiave primaria/esterna nella tabella?
- 9. Vincolo SQL: due attributi, almeno una corrispondenza di chiave esterna sulla stessa tabella
- 10. condizionale chiave esterna in SQL
- 11. Come inserire vincoli di chiave esterna su un campo calcolato in SQL Server?
- 12. Partizionamento SQL Server - Errore indice univoco
- 13. chiave esterna che fa riferimento una chiave primaria 2 colonne in SQL Server
- 14. Ogni ramo possibile in un metodo deve avere un'unità separata?
- 15. SQL Aggiungi chiave esterna alla colonna esistente
- 16. Indice composito vs. INDICE di copertura INCLUDE in SQL Server
- 17. Come posso eliminare una tabella se esiste un vincolo di chiave esterna in SQL Server?
- 18. Indici di SQL Server: quali colonne includere nell'indice?
- 19. Domanda chiave esterna MySQL
- 20. Chiave esterna Modello Django
- 21. deadlock di SQL Server 2005 con indice non cluster
- 22. SQL Server: eliminazione di righe con vincoli di chiave esterna: le transazioni possono sovrascrivere i vincoli?
- 23. SQL Server non utilizzerà il mio indice
- 24. avere un quadro del fotogramma di un video ogni secondo
- 25. Errore di corrispondenza MD5 tra server SQL e PostgreSQL
- 26. vb.net: numero indice di un "per ogni"
- 27. SQL 2008: vincoli di chiave esterna nella vista INFORMATION_SCHEMA
- 28. Disabilitare il vincolo di chiave esterna, non è ancora possibile troncare la tabella? (SQL Server 2005)
- 29. SQL Server: come ottenere il riferimento di chiave esterna da information_schema?
- 30. Come posso duplicare una chiave simmetrica di SQL Server?
È una buona pratica in alcuni casi, ma non per * ogni * chiave esterna. –