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+ OrderIdakan menjadi pilihan yang lebih baik karena alasan berikut:
- Hampir semua pertanyaan akan dicari
WHERE CustomerId = @param, bukanOrderId CustomerIdadalah kunci asing keCustomertabel, sehingga memiliki indeks berkerumun denganCustomerIdharus mempercepat bergabung- Meskipun
CustomerIdtidak unik, memilikiOrderIdkolom tambahan yang ditentukan dalam indeks akan memastikan keunikan (Kami dapat menggunakanUNIQUEkata kunci saat membuat indeks berkerumun di 2 kolom tersebut, untuk menghindari biaya tambahan karena tidak memiliki keunikan) - Setelah data dimasukkan,
CustomerIddanOrderIdtidak 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
CustomerIdmasuk, indeks berkerumun akan dapat menyediakan semua kolom tanpa pekerjaan tambahan.
Apakah pendekatan CustomerIddan OrderIdterdengar seperti opsi terbaik yang diberikan di atas? Atau, apakah OrderIddengan 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.