Katakanlah saya memiliki baris ID (int) dalam database yang ditetapkan sebagai kunci utama. Jika saya sering menanyakan ID, apakah saya juga perlu mengindeksnya? Atau apakah itu kunci utama berarti sudah diindeks?
Alasan saya bertanya adalah karena di MS SQL Server saya dapat membuat indeks pada ID ini, yang seperti yang saya nyatakan adalah kunci utama saya.
Sunting: pertanyaan tambahan - apakah ada salahnya untuk mengindeks tambahan kunci utama?
sumber
Seperti yang telah dikatakan orang lain, kunci primer diindeks secara otomatis.
Membuat lebih banyak indeks pada kolom kunci utama hanya masuk akal saat Anda perlu mengoptimalkan kueri yang menggunakan kunci utama dan beberapa kolom spesifik lainnya. Dengan membuat indeks lain pada kolom kunci utama dan menyertakan beberapa kolom lain dengannya, Anda dapat mencapai pengoptimalan yang diinginkan untuk sebuah kueri.
Misalnya Anda memiliki tabel dengan banyak kolom tetapi Anda hanya menanyakan kolom ID, Nama dan Alamat. Mengambil ID sebagai kunci utama, kita dapat membuat indeks berikut yang dibangun di atas ID tetapi menyertakan kolom Nama dan Alamat.
Jadi, saat Anda menggunakan kueri ini:
SQL Server akan memberi Anda hasil hanya menggunakan indeks yang Anda buat dan tidak akan membaca apa pun dari tabel sebenarnya.
sumber
CATATAN: Jawaban ini membahas pengembangan kelas perusahaan dalam skala besar .
Ini adalah masalah RDBMS, bukan hanya SQL Server, dan perilakunya bisa sangat menarik. Pertama, meskipun kunci primer secara otomatis (unik) diindeks, itu TIDAK mutlak. Ada kalanya kunci utama TIDAK diindeks secara unik.
Di sebagian besar RDBMS, indeks unik akan secara otomatis dibuat pada kunci utama jika belum ada . Oleh karena itu, Anda dapat membuat indeks Anda sendiri pada kolom kunci utama sebelum mendeklarasikannya sebagai kunci utama, kemudian indeks tersebut akan digunakan (jika dapat diterima) oleh mesin database saat Anda menerapkan deklarasi kunci utama. Seringkali, Anda dapat membuat kunci utama dan mengizinkan indeks unik defaultnya dibuat, lalu membuat indeks alternatif Anda sendiri di kolom itu, lalu melepaskan indeks default.
Sekarang untuk bagian yang menyenangkan - kapan Anda TIDAK menginginkan indeks kunci utama yang unik? Anda tidak menginginkannya, dan tidak dapat mentolerirnya, ketika tabel Anda memperoleh cukup data (baris) untuk membuat pemeliharaan indeks menjadi terlalu mahal. Ini bervariasi berdasarkan perangkat keras, mesin RDBMS, karakteristik tabel dan database, dan beban sistem. Namun, ini biasanya mulai terwujud setelah tabel mencapai beberapa juta baris.
Masalah penting adalah bahwa setiap penyisipan baris atau pembaruan kolom kunci utama menghasilkan pemindaian indeks untuk memastikan keunikan. Pemindaian indeks unik itu (atau ekuivalennya di RDBMS mana pun) menjadi jauh lebih mahal seiring pertumbuhan tabel, hingga mendominasi kinerja tabel.
Saya telah berkali-kali menangani masalah ini dengan tabel sebesar dua miliar baris, penyimpanan 8 TB, dan empat puluh juta baris sisipan per hari. Saya ditugaskan untuk mendesain ulang sistem yang terlibat, termasuk menjatuhkan indeks kunci primer unik secara praktis sebagai langkah pertama. Memang, menurunkan indeks itu perlu dalam produksi hanya untuk memulihkan dari pemadaman, bahkan sebelum kami mendekati desain ulang. Desain ulang itu termasuk menemukan cara lain untuk memastikan keunikan kunci utama dan menyediakan akses cepat ke data.
sumber
IDENTITY
bidang tidak dijamin unik. Bagaimanapun, pengguna dapat memasukkan nilai duplikat jika mereka penggunaIDENTITY_INSERT
.Kunci utama selalu diindeks secara default.
http://technet.microsoft.com/en-us/library/ms189039.aspx
sumber
Berikut bagian dari MSDN :
sumber
PK akan menjadi indeks berkerumun kecuali Anda menentukan non berkerumun
sumber
Mendeklarasikan
PRIMARY KEY
atauUNIQUE
kendala menyebabkan SQL Server secara otomatis membuat indeks.Indeks unik dapat dibuat tanpa mencocokkan batasan, tetapi batasan (baik kunci utama atau unik) tidak dapat ada tanpa indeks unik.
Dari sini, pembuatan batasan akan:
dan pada saat yang sama menghilangkan batasan akan menurunkan indeks terkait.
Jadi, apakah sebenarnya ada perbedaan antara a
PRIMARY KEY
atauUNIQUE INDEX
:NULL
nilai tidak diperbolehkan masukPRIMARY KEY
, tapi diperbolehkan dalamUNIQUE
indeks; dan seperti pada operator set (UNION, EXCEPT, INTERSECT), di siniNULL = NULL
artinya Anda hanya dapat memiliki satu nilai karena duaNULL
ditemukan sebagai duplikat satu sama lain;PRIMARY KEY
mungkin ada per tabel sementara 999 indeks unik dapat dibuatPRIMARY KEY
batasan dibuat, itu dibuat sebagai clustered kecuali sudah ada indeks berkerumun pada tabel atauNONCLUSTERED
digunakan dalam definisinya; ketikaUNIQUE
indeks dibuat, itu dibuat seolah-NONCLUSTERED
olah tidak spesifik untuk menjadiCLUSTERED
dan yang sudah tidak ada;sumber
Menjadikannya kunci utama juga secara otomatis membuat indeks untuknya.
sumber
Nah di SQL Server, umumnya kunci primer diindeks secara otomatis. Ini benar, tetapi tidak menjamin kueri yang lebih cepat. Kunci utama akan memberi Anda kinerja yang sangat baik bila hanya ada 1 bidang sebagai kunci utama. Namun, jika ada beberapa bidang sebagai kunci utama, maka indeks didasarkan pada bidang tersebut.
Sebagai contoh: Bidang A, B, C adalah kunci utama, jadi ketika Anda melakukan kueri berdasarkan 3 bidang tersebut di WHERE CLAUSE Anda, kinerjanya bagus, TETAPI ketika Anda ingin menanyakan dengan hanya bidang C di WHERE CLAUSE, Anda tidak akan mendapatkan kinerja yang baik. Jadi, untuk mendapatkan kinerja Anda dan berjalan, Anda perlu mengindeks kolom C secara manual.
Sering kali, Anda tidak akan melihat masalah hingga mencapai lebih dari 1 juta rekaman.
sumber
Saya memiliki database besar tanpa indeks (terpisah).
Setiap kali saya melakukan kueri dengan kunci utama, hasilnya, untuk semua tujuan intensif, instan.
sumber
kunci utama secara otomatis diindeks
Anda dapat membuat indeks tambahan menggunakan pk tergantung pada penggunaan Anda
sumber