Menurut CREATE INDEX
dokumentasi:
Hingga 16 kolom dapat digabungkan menjadi satu kunci indeks komposit.
Kami punya tabel dengan ~ 18 kolom yang perlu membentuk kombinasi unik. Tabel ini tidak peka terhadap kinerja - kami jarang memperbarui nilai / memasukkan catatan. Kami hanya perlu memastikan bahwa kami menghindari duplikasi catatan kami ... dan berpikir kami bisa memaksakan kendala keunikan sederhana.
Ada ide? Saya terbuka untuk menghindari indeks unik / kendala sepenuhnya jika ada cara yang lebih baik.
Jawaban:
Tambahkan kolom yang dihitung terus - menerus yang menggabungkan 18 kunci, lalu buat indeks unik pada kolom yang dihitung:
Lihat Membuat Indeks pada Kolom yang Dihitung .
Pendekatan lain adalah membuat tampilan yang diindeks:
Lihat Membuat Tampilan Terindeks .
Kedua pendekatan memungkinkan untuk agregat kunci parsial: agregat c1 + c2 + c3 sebagai k1, c4 + c5 + c6 sebagai k2 dll. Kemudian indeks / buat tampilan yang diindeks pada (k1, k2, ...). Thia dapat bermanfaat untuk pemindaian rentang (indeks dapat digunakan untuk pencarian di c1 + c2 + c3.
Tentu saja, semua
+
operasi dalam contoh saya adalah agregasi string, operator yang sebenarnya untuk digunakan tergantung pada jenis semua kolom tersebut (mis. Anda mungkin harus menggunakan gips eksplisit).PS. Karena kendala unik ditegakkan oleh indeks unik, segala pembatasan pada indeks unik akan berlaku untuk kendala unik juga:
Namun, membuat batasan pada kolom yang dikomputasi tetap berfungsi:
Jelas, kolom yang bertahan mengkonsumsi ruang pada disk sehingga pendekatannya mungkin buruk untuk tabel yang sangat besar. Pendekatan tampilan diindeks tidak memiliki masalah ini, itu hanya mengkonsumsi ruang untuk indeks , bukan ruang untuk kolom dan indeks dihitung .
sumber
Saya pikir Anda akan melakukan jauh lebih baik untuk menempatkan cek indeks unik Anda pada kolom yang dihitung yang dihasilkan menggunakan
HASHBYTES('MD5', ...)
pada kombinasi 18 kolom Anda.sumber
Saya mengalami masalah ini dan DBA senior saya menyarankan menggunakan fungsi pengecekan keunikan. Sisipan saya relatif kecil dan jarang (~ 1000 baris, dimasukkan pada awal setiap bulan) dan satu-satunya perhatian saya adalah menegakkan keunikan.
@RBarryYoung, saya belum memiliki perwakilan untuk berkomentar, tetapi saya mengalami masalah dengan solusi HASHBYTES karena salah satu tipe data saya adalah waktu, dan saya melakukan kesalahan pemula (?) Karena tidak memberikan argumen gaya opsional kepada saya Fungsi CONVERT ketika mengkonversi ke varchar. Tanpa gaya, Anda mendapatkan kesalahan berikut ketika Anda mencoba menambahkan
PERSISTED UNIQUE NONCLUSTERED
kendala:sumber
Anda bisa menggabungkan beberapa nilai untuk membuat nilai unik baru dan menyimpannya di samping data saat ini.
Buat fungsi yang ditentukan pengguna untuk membuat nilai-nilai baru dan pemicu untuk mengisi bidang ketika data ditambahkan, maka Anda tidak memiliki banyak overhead dalam mempertahankan bidang.
Menggabungkan dua atau tiga bidang Anda akan membuat Anda di bawah batas 16.
sumber
Anda bisa menggunakan pemicu untuk
insert
/update
. Lakukan pengelompokan pilih berdasarkan kolom Anda dengan klausahaving count(*) > 1
. Jika itu kembali tidak kosong, putar kembali.sumber
Inilah yang akan saya lakukan. Saya akan membuat pemicu SETELAH untuk INSERT, PEMBARUAN yang melakukan
ROW_NUMBER ()
fungsi, dan partisi oleh semua 18 kolom unik Anda. Jika jumlah baris maksimum lebih dari satu, maka lakukan aROLLBACK
.sumber