Di EF Code First, alasan umum mengapa Anda memodelkan hubungan kunci asing adalah untuk navigasi antar entitas. Pertimbangkan skenario sederhana Country
dan City
, dengan pemuatan bersemangat yang ditentukan untuk pernyataan LINQ berikut:
var someQuery =
db.Countries
.Include(co => co.City)
.Where(co => co.Name == "Japan")
.Select(...);
Ini akan menghasilkan kueri sepanjang baris:
SELECT *
FROM Country co
INNER JOIN City ci
ON ci.CountryId = co.ID
WHERE co.Name = 'Japan';
Tanpa Indeks pada kunci asing di City.CountryId
, SQL perlu memindai tabel Kota untuk memfilter kota untuk Negara selama GABUNG.
Indeks FK juga akan memiliki manfaat kinerja jika baris dihapus
dari tabel Negara induk, karena integritas referensial perlu mendeteksi keberadaan setiap baris Kota yang ditautkan (apakah FK memiliki ON CASCADE DELETE
ditentukan atau tidak).
TL;DR
Indeks pada Kunci Asing adalah disarankan , bahkan jika Anda tidak memfilter secara langsung pada kunci asing, itu akan tetap diperlukan di Gabung. Pengecualian untuk ini tampaknya cukup dibuat-buat:
-
Jika selektivitas kunci asing sangat rendah, mis. dalam skenario di atas, jika 50% dari SEMUA kota di tabel negara berada di Jepang, maka Indeks tidak akan berguna.
-
Jika Anda tidak pernah benar-benar menavigasi seluruh hubungan.
-
Jika Anda tidak pernah menghapus baris dari tabel induk (atau mencoba memperbarui PK) .
Satu pertimbangan pengoptimalan tambahan adalah apakah akan menggunakan kunci asing di Clustered Index
dari tabel anak (yaitu mengelompokkan Kota menurut Negara). Ini sering bermanfaat dalam hubungan tabel induk :anak di mana merupakan tempat umum untuk mengambil semua baris anak untuk induk secara bersamaan.