Saya telah diberitahu bahwa jika saya kunci asing dua tabel, SQL Server akan membuat sesuatu yang mirip dengan indeks di tabel anak. Saya kesulitan mempercayai ini benar, tetapi tidak bisa menemukan banyak di luar sana yang terkait dengan ini.
Alasan sebenarnya saya menanyakan hal ini adalah karena kami mengalami waktu respons yang sangat lambat dalam pernyataan penghapusan terhadap tabel yang mungkin memiliki 15 tabel terkait. Saya telah bertanya kepada orang basis data kami dan dia mengatakan bahwa jika ada kunci asing di ladang, maka itu bertindak seperti indeks. Apa pengalaman Anda dengan ini? Haruskah saya menambahkan indeks pada semua bidang kunci asing atau hanya overhead yang tidak perlu?
sql-server
Nick DeVore
sumber
sumber
Jawaban:
Kunci asing adalah kendala, hubungan antara dua tabel - yang tidak ada hubungannya dengan indeks per se.
Tetapi ini adalah fakta yang diketahui bahwa sangat masuk akal untuk mengindeks semua kolom yang merupakan bagian dari hubungan kunci asing, karena melalui hubungan FK, Anda akan sering perlu mencari tabel terkait dan mengekstrak baris tertentu berdasarkan nilai tunggal atau rentang nilai.
Jadi masuk akal untuk mengindeks setiap kolom yang terlibat dalam FK, tetapi FK per se bukanlah indeks.
Lihat artikel hebat Kimberly Tripp "Kapan SQL Server berhenti meletakkan indeks pada kolom Kunci Asing?" .
sumber
REFERENCES
. Secara otomatis membuatUNIQUE
indeks untuk suatuPRIMARY KEY
atauUNIQUE
kendala, dan mengharuskanUNIQUE
indeks hadir untuk akhir yang dirujuk dari hubungan kunci asing, tetapi tidak melakukan apa pun secara otomatis untuk akhir referensi , meskipun sering kali merupakan ide yang baik untuk membuatnya sendiri. Lihat stackoverflow.com/questions/970562/…Wow, jawabannya ada di peta. Jadi Dokumentasi mengatakan:
Batasan KUNCI ASING adalah kandidat untuk indeks karena:
Perubahan batasan PRIMARY KEY diperiksa dengan batasan FOREIGN KEY di tabel terkait.
Kolom kunci asing sering digunakan dalam kriteria gabungan ketika data dari tabel terkait digabungkan dalam kueri dengan mencocokkan kolom dalam batasan ASING dari satu tabel dengan kolom kunci utama atau unik di tabel lain. Indeks memungkinkan Microsoft® SQL Server ™ 2000 untuk menemukan data terkait dalam tabel kunci asing dengan cepat. Namun, membuat indeks ini bukan keharusan. Data dari dua tabel terkait dapat digabungkan bahkan jika tidak ada batasan PRIMARY KEY atau FOREIGN KEY yang didefinisikan di antara tabel, tetapi hubungan kunci asing antara dua tabel menunjukkan bahwa dua tabel telah dioptimalkan untuk digabungkan dalam permintaan yang menggunakan kunci sebagai kriterianya.
Jadi sepertinya cukup jelas (walaupun dokumentasinya agak kacau) bahwa sebenarnya tidak membuat indeks.
sumber
Tidak, tidak ada indeks implisit pada bidang kunci asing, jika tidak mengapa Microsoft mengatakan "Membuat indeks pada kunci asing sering berguna" . Kolega Anda mungkin membingungkan bidang kunci asing di tabel referensi dengan kunci utama di tabel yang dirujuk ke - kunci utama memang membuat indeks implisit.
sumber
SQL Server membuat otomatis indeks untuk Kunci Utama, tetapi tidak untuk Kunci Asing. Buat indeks untuk Kunci Asing. Mungkin bernilai overhead.
sumber
Katakanlah Anda memiliki meja besar yang disebut pesanan, dan meja kecil yang disebut pelanggan. Ada kunci asing dari pesanan ke pelanggan. Sekarang jika Anda menghapus pelanggan, Sql Server harus memeriksa bahwa tidak ada pesanan anak yatim; jika ada, itu menimbulkan kesalahan.
Untuk memeriksa apakah ada pesanan, Sql Server harus mencari tabel pesanan besar. Sekarang jika ada indeks, pencarian akan cepat; jika tidak, pencarian akan lambat.
Jadi dalam hal ini, penghapusan lambat bisa dijelaskan dengan tidak adanya indeks. Apalagi jika Sql Server harus mencari 15 tabel besar tanpa indeks.
NB. Jika kunci asing memiliki HAPUS HAPUS CASCADE, Sql Server masih harus mencari tabel pesanan, tetapi kemudian untuk menghapus perintah yang merujuk pelanggan yang dihapus.
sumber
Kunci asing tidak membuat indeks. Hanya batasan kunci alternatif (UNIK) dan batasan kunci primer yang membuat indeks. Ini berlaku di Oracle dan SQL Server.
sumber
Tidak sepengetahuan saya. Kunci asing hanya menambahkan batasan bahwa nilai dalam kunci anak juga diwakili di suatu tempat di kolom induk. Itu tidak memberi tahu database bahwa kunci anak juga perlu diindeks, hanya dibatasi.
sumber
Sebenarnya, kunci asing sama sekali tidak ada hubungannya dengan indeks, ya. Tapi, seperti yang ditunjukkan oleh pembicara di atas, masuk akal untuk membuat satu untuk mempercepat pencarian FK. Bahkan, di MySQL, jika Anda tidak menentukan indeks dalam deklarasi FK Anda, mesin (InnoDB) membuatnya untuk Anda secara otomatis.
sumber
Di PostgeSql Anda dapat memeriksa indeks sendiri jika Anda menekan \ nama tab
Anda akan melihat bahwa indeks btree telah secara otomatis dibuat pada kolom dengan kunci primer dan batasan unik, tetapi tidak pada kolom dengan kunci asing.
Saya pikir itu menjawab pertanyaan Anda setidaknya untuk postgres.
sumber
Saya perhatikan bahwa Entity Framework 6.1 menunjuk pada MSSQL tidak secara otomatis menambahkan indeks pada kunci asing.
sumber
InnoDB membutuhkan indeks pada kunci asing dan kunci referensi sehingga pemeriksaan kunci asing dapat cepat dan tidak memerlukan pemindaian tabel. Dalam tabel referensi, harus ada indeks di mana kolom kunci asing terdaftar sebagai kolom pertama dalam urutan yang sama.
sumber