Diberikan beberapa tabel dengan kunci utama, misalnya:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
kami memiliki kunci primer unik CustomerID.
Secara tradisional saya mungkin perlu beberapa indeks penutup tambahan; misalnya untuk dengan cepat menemukan pengguna dengan salah satu CustomerIDatau Email:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
Dan ini adalah jenis indeks yang telah saya buat selama beberapa dekade.
Tidak harus unik, tetapi sebenarnya memang begitu
Indeks itu sendiri ada untuk menghindari pemindaian tabel; ini adalah indeks penutup untuk membantu kinerja (indeks tidak ada sebagai kendala untuk menegakkan keunikan).
Hari ini saya ingat sedikit informasi - SQL Server dapat menggunakan fakta bahwa:
- sebuah kolom memiliki batasan kunci asing
- sebuah kolom memiliki indeks unik
- kendala dipercaya
untuk membantu mengoptimalkan eksekusi permintaannya. Bahkan, dari Panduan Perancangan Indeks SQL Server :
Jika data unik dan Anda ingin menerapkan keunikan, membuat indeks unik alih-alih indeks nonunique pada kombinasi kolom yang sama memberikan informasi tambahan untuk pengoptimal kueri yang dapat menghasilkan rencana pelaksanaan yang lebih efisien . Membuat indeks unik (lebih disukai dengan membuat batasan UNIK) direkomendasikan dalam kasus ini.
Mengingat bahwa indeks multi-kolom saya berisi kunci utama, indeks komposit ini akan de facto menjadi unik. Ini bukan kendala yang saya butuhkan terutama SQL Server untuk menegakkan selama setiap memasukkan atau memperbarui; tetapi faktanya indeks non-cluster ini unik.
Apakah ada keuntungan dalam menandai indeks unik de facto ini sebagai benar-benar unik?
BUAT INDEKS UNIK IX_Customers_CustomerIDEmail ON pelanggan ( ID Pelanggan, Surel )
Sepertinya saya bahwa SQL Server bisa cukup pintar untuk menyadari bahwa indeks saya sudah adalah unik berdasarkan fakta bahwa itu berisi kunci primer.
- Tapi mungkin tidak tahu ini, dan ada keuntungan bagi pengoptimal jika saya menyatakan indeks sebagai unik.
- Kecuali mungkin yang sekarang dapat menyebabkan pelambatan saat memasukkan dan memperbarui, di mana ia harus melakukan pemeriksaan keunikan - di mana sebelumnya tidak pernah harus sebelumnya.
- Kecuali ia tahu indeks dijamin sudah unik, karena mengandung kunci utama.
Saya tidak dapat menemukan panduan apa pun dari Microsoft tentang apa yang harus dilakukan ketika indeks komposit berisi kunci utama.
Manfaat indeks unik meliputi:
- Integritas data kolom yang ditentukan dipastikan.
- Informasi tambahan yang bermanfaat bagi pengoptimal kueri disediakan.
Haruskah saya menandai indeks komposit sebagai unik jika sudah berisi kunci utama? Atau dapatkah SQL Server mencari tahu ini sendiri?


