Thêm một cột được tính toán bền bỉ kết hợp 18 khóa, sau đó tạo một chỉ mục duy nhất trên cột được tính:
alter table t add all_keys as c1+c2+c3+...+c18 persisted;
create unique index i18 on t (all_keys);
Xem Tạo chỉ mục trên các cột được tính toán .
Một cách tiếp cận khác là tạo ra một khung nhìn được lập chỉ mục:
create view v
with schemabinding
as select c1+c2+c3+...+c18 as all_keys
from dbo.t;
create unique clustered index c18 on v(all_keys);
Xem Tạo Chế độ xem được lập chỉ mục .
Cả hai cách tiếp cận đều cho phép tổng hợp khóa một phần: tổng hợp c1 + c2 + c3 là k1, c4 + c5 + c6 là k2, v.v. sau đó lập chỉ mục / tạo chế độ xem được lập chỉ mục trên (k1, k2, ...). Thia có thể có lợi cho quét phạm vi (chỉ mục có thể được sử dụng để tìm kiếm trên c1 + c2 + c3.
Tất nhiên, tất cả các +
hoạt động trong ví dụ của tôi là tập hợp chuỗi, toán tử thực tế sử dụng phụ thuộc vào loại của tất cả các cột đó (tức là bạn có thể phải sử dụng các biểu mẫu rõ ràng).
Tái bút Vì các ràng buộc duy nhất được thi hành bởi một chỉ mục duy nhất, mọi hạn chế đối với các chỉ mục duy nhất cũng sẽ được áp dụng cho các ràng buộc duy nhất:
create table t (
c1 char(3), c2 char(3), c3 char(3), c4 char(3),
c5 char(3), c6 char(3), c7 char(3), c8 char(3),
c9 char(3), c10 char(3), c11 char(3), c12 char(3),
c13 char(3), c14 char(3), c15 char(3), c16 char(3),
c17 char(3), c18 char(3), c19 char(3), c20 char(3),
constraint unq unique
(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18));
go
Msg 1904, Level 16, State 1, Line 3
The index '' on table 't' has 18 column names in index key list.
The maximum limit for index or statistics key column list is 16.
Msg 1750, Level 16, State 0, Line 3
Could not create constraint. See previous errors.
Tuy nhiên, việc tạo ra các ràng buộc trên một cột được tính toán bền vững:
create table t (
c1 char(3), c2 char(3), c3 char(3), c4 char(3),
c5 char(3), c6 char(3), c7 char(3), c8 char(3),
c9 char(3), c10 char(3), c11 char(3), c12 char(3),
c13 char(3), c14 char(3), c15 char(3), c16 char(3),
c17 char(3), c18 char(3), c19 char(3), c20 char(3),
all_c as
c1+c2+c3+c4+c5+c6+c7+c8+c9+c10+c11+
c12+c13+c14+c15+c16+c17+c18
persisted
constraint unq unique (all_c));
go
Rõ ràng, cột bền bỉ tiêu tốn dung lượng trên đĩa nên cách tiếp cận có thể không tốt cho một bảng rất lớn. Cách tiếp cận khung nhìn được lập chỉ mục không có vấn đề này, nó chỉ tiêu tốn không gian cho chỉ mục , không phải không gian cho cột và chỉ mục được tính toán .