Tôi có một bảng SQL Server 2014 giống như sau:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
Một số người trong nhóm của tôi đã gợi ý rằng chỉ số được nhóm nên được bật OrderId
, nhưng tôi nghĩ rằng dấu CustomerId
+ OrderId
sẽ là lựa chọn tốt hơn vì những lý do sau:
- Hầu như tất cả các truy vấn sẽ được tìm kiếm
WHERE CustomerId = @param
, khôngOrderId
CustomerId
là một khóa ngoại đối vớiCustomer
bảng, do đó, có một chỉ mục được nhóm vớiCustomerId
nên tăng tốc độ tham gia- Mặc dù
CustomerId
không phải là duy nhất, nhưng có thêmOrderId
cột được chỉ định trong chỉ mục sẽ đảm bảo tính duy nhất (Chúng tôi có thể sử dụngUNIQUE
từ khóa khi tạo chỉ mục được nhóm trên 2 cột đó, để tránh chi phí không có tính duy nhất) - Khi dữ liệu được chèn,
CustomerId
vàOrderId
không bao giờ thay đổi, vì vậy những hàng này sẽ không di chuyển xung quanh sau khi ghi ban đầu. - Truy cập dữ liệu xảy ra thông qua ORM yêu cầu tất cả các cột theo mặc định, do đó, khi truy vấn dựa vào
CustomerId
, chỉ mục được nhóm sẽ có thể cung cấp tất cả các cột mà không cần bất kỳ công việc bổ sung nào.
Liệu CustomerId
và OrderId
cách tiếp cận có vẻ như là lựa chọn tốt nhất được đưa ra ở trên? Hoặc, là OrderId
tốt hơn, vì nó là một cột duy nhất đảm bảo tính duy nhất của chính nó?
Hiện tại, bảng có một chỉ mục được nhóm OrderId
và một chỉ mục CustomerId
không được bao gồm, nhưng nó không bao gồm, vì vậy chúng tôi đang sử dụng ORM và tất cả các cột được yêu cầu, nên việc lấy lại chúng là một công việc bổ sung. Vì vậy, với bài đăng này, tôi đang cố gắng xem xét cải thiện hiệu suất với CI tốt hơn.
Hoạt động trên DB của chúng tôi là khoảng 85% đọc và 15% viết.