Ketika saya ingin kolom memiliki nilai yang berbeda, saya bisa menggunakan batasan
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
atau saya bisa menggunakan indeks unik
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
Kolom dengan batasan unik tampaknya menjadi kandidat yang baik untuk indeks unik.
Adakah alasan yang diketahui untuk menggunakan batasan unik dan bukan untuk menggunakan indeks unik saja?
Jawaban:
Di bawah tenda, batasan unik diimplementasikan dengan cara yang sama dengan indeks unik - indeks diperlukan untuk secara efisien memenuhi persyaratan untuk menegakkan batasan. Bahkan jika indeks dibuat sebagai hasil dari batasan UNIK, perencana kueri dapat menggunakannya seperti indeks lainnya jika melihatnya sebagai cara terbaik untuk mendekati kueri yang diberikan.
Jadi untuk database yang mendukung kedua fitur pilihan yang akan digunakan akan sering turun ke gaya dan konsistensi yang disukai.
Jika Anda berencana untuk menggunakan indeks sebagai indeks (mis. Kode Anda mungkin mengandalkan pencarian / pengurutan / pemfilteran pada bidang itu agar lebih cepat) Saya akan secara eksplisit menggunakan indeks yang unik (dan mengomentari sumbernya) daripada menjadi kendala untuk membuatnya jelas - dengan cara ini jika persyaratan keunikan diubah dalam revisi nanti dari aplikasi yang Anda (atau coder lain) akan tahu untuk memastikan indeks non-unik diletakkan di tempat yang unik (hanya menghapus kendala unik akan menghapus indeks sepenuhnya). Juga indeks tertentu dapat dinamai dalam petunjuk indeks (yaitu DENGAN (INDEX (ix_index_name)), yang menurut saya bukan kasus untuk indeks yang dibuat di belakang layar untuk mengelola keunikan karena Anda tidak mungkin tahu namanya.
Demikian juga jika Anda hanya perlu menegakkan keunikan sebagai aturan bisnis daripada bidang yang perlu dicari atau digunakan untuk menyortir maka saya akan menggunakan kendala, lagi untuk membuat penggunaan yang dimaksudkan lebih jelas ketika orang lain melihat definisi tabel Anda.
Perhatikan bahwa jika Anda menggunakan batasan unik dan indeks unik pada bidang yang sama, basis data tidak akan cukup cerah untuk melihat duplikasi, sehingga Anda akan berakhir dengan dua indeks yang akan menggunakan ruang ekstra dan memperlambat sisipan / pembaruan baris.
sumber
CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1
. Indeks dapat lebih fleksibel meskipun dalam hal kendala tidak mendukung semua opsi indeks sepertiINCLUDE
d kolom atau indeks yang difilter.Selain poin dalam jawaban lain, berikut adalah beberapa perbedaan utama antara keduanya.
Catatan: Pesan kesalahan berasal dari SQL Server 2012.
Kesalahan
Pelanggaran galat pengembalian kendala unik 2627.
Pelanggaran kesalahan pengembalian indeks unik 2601.
Menonaktifkan
Batasan unik tidak dapat dinonaktifkan.
Tetapi indeks unik di belakang batasan kunci primer atau batasan unik dapat dinonaktifkan, seperti halnya indeks unik apa pun. Hat-tip Brain2000.
Perhatikan peringatan biasa bahwa menonaktifkan indeks yang dikelompokkan membuat data tidak dapat diakses.
Pilihan
Kendala unik mendukung opsi pengindeksan seperti
FILLFACTOR
danIGNORE_DUP_KEY
, meskipun ini tidak berlaku untuk setiap versi SQL Server.Termasuk Kolom
Indeks nonclustered dapat mencakup kolom yang tidak diindeks (disebut indeks penutup, ini adalah peningkatan kinerja utama). Indeks di balik kendala PRIMARY KEY dan UNIQUE tidak dapat menyertakan kolom. Hat-tip @ ypercube.
Penyaringan
Batasan unik tidak dapat difilter.
Indeks unik dapat difilter.
Batasan Kunci Asing
Batasan kunci asing tidak dapat referensi indeks unik difilter, meskipun itu dapat referensi indeks unik non-terfilter (saya pikir ini ditambahkan dalam SQL Server 2005).
Penamaan
Saat membuat kendala, menentukan nama kendala adalah opsional (untuk semua lima jenis kendala). Jika Anda tidak menentukan nama maka MSSQL akan menghasilkan satu untuk Anda.
Saat membuat indeks, Anda harus menentukan nama.
Hat-tip @ i-one.
Tautan
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx
sumber
Mengutip MSDN sebagai sumber resmi:
Dan...
Lainnya ke: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
sumber
Salah satu perbedaan utama antara batasan unik dan indeks unik adalah bahwa batasan kunci asing pada tabel lain dapat mereferensikan kolom yang membentuk batasan unik. Ini tidak benar untuk indeks unik. Selain itu, batasan unik didefinisikan sebagai bagian dari standar ANSI, sedangkan indeks tidak. Akhirnya, kendala unik di anggap tinggal di ranah desain basis data logis (yang mungkin diimplementasikan secara berbeda oleh mesin DB yang berbeda) sementara indeks adalah aspek fisik. Oleh karena itu, kendala unik lebih bersifat deklaratif. Saya lebih suka kendala unik di hampir semua kasus.
sumber
Dalam Oracle perbedaan utama adalah Anda dapat membuat indeks fungsi-unik, yang tidak dapat dilakukan dengan kendala unik:
Sebagai contoh
Jadi
fk_xyz
hanya unik untuk record yang dimilikiamount != 0
.sumber
WHERE
klausa.CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
Batasan UNIK lebih disukai daripada Indeks UNIK. Ketika kendala tidak unik, Anda perlu menggunakan indeks biasa atau tidak unik. Batasan juga merupakan jenis indeks lainnya. Indeks digunakan untuk akses yang lebih cepat.
Indeks unik dapat memiliki klausa mana. Misalnya, Anda dapat membuat indeks untuk setiap tahun berdasarkan kolom tanggal
sumber