Saya memiliki tabel SQL Server 2014 yang terlihat seperti berikut:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Beberapa orang di tim saya menyarankan agar indeks berkerumun berada di OrderId
, tetapi saya pikir CustomerId
+ OrderId
akan menjadi pilihan yang lebih baik karena alasan berikut:
- Hampir semua pertanyaan akan dicari
WHERE CustomerId = @param
, bukanOrderId
CustomerId
adalah kunci asing keCustomer
tabel, sehingga memiliki indeks berkerumun denganCustomerId
harus mempercepat bergabung- Meskipun
CustomerId
tidak unik, memilikiOrderId
kolom tambahan yang ditentukan dalam indeks akan memastikan keunikan (Kami dapat menggunakanUNIQUE
kata kunci saat membuat indeks berkerumun di 2 kolom tersebut, untuk menghindari biaya tambahan karena tidak memiliki keunikan) - Setelah data dimasukkan,
CustomerId
danOrderId
tidak pernah berubah, jadi baris ini tidak akan bergerak setelah penulisan awal. - Akses data terjadi melalui ORM yang meminta semua kolom secara default, jadi ketika kueri berdasarkan
CustomerId
masuk, indeks berkerumun akan dapat menyediakan semua kolom tanpa pekerjaan tambahan.
Apakah pendekatan CustomerId
dan OrderId
terdengar seperti opsi terbaik yang diberikan di atas? Atau, apakah OrderId
dengan sendirinya lebih baik, karena itu adalah satu kolom yang menjamin keunikan dengan sendirinya?
Saat ini, tabel memiliki indeks berkerumun di OrderId
, dan indeks nonclustered aktif CustomerId
, tapi itu tidak mencakup, jadi karena kita menggunakan ORM dan semua kolom diminta, itu pekerjaan tambahan untuk mengambilnya. Jadi dengan posting ini, saya mencoba mempertimbangkan untuk meningkatkan kinerja dengan CI yang lebih baik.
Aktivitas pada DB kami sekitar 85% dibaca dan 15% ditulis.