18個のキーを組み合わせた永続的な計算列を追加してから、計算列に一意のインデックスを作成します。
alter table t add all_keys as c1+c2+c3+...+c18 persisted;
create unique index i18 on t (all_keys);
計算列でのインデックスの作成を参照してください。
もう1つの方法は、インデックス付きビューを作成することです。
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);
インデックス付きビューの作成を参照してください。
どちらのアプローチでも部分的なキー集計が可能です。c1+ c2 + c3をk1、c4 + c5 + c6をk2として集計し、(k1、k2、...)でインデックス付きビューをインデックス付け/作成します。チアは、範囲スキャンに役立つ可能性があります(インデックスはc1 + c2 + c3の検索に使用できます。
もちろん、+
私の例のすべての操作は文字列集計です。実際に使用する演算子は、それらのすべての列のタイプによって異なります(つまり、明示的なキャストを使用する必要がある場合があります)。
PS。一意の制約は一意のインデックスによって適用されるため、一意のインデックスに対する制限は一意の制約にも適用されます。
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.
ただし、永続的な計算列に制約を作成すると機能します。
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
明らかに、永続化された列はディスク上のスペースを消費するため、非常に大きなテーブルではアプローチが不適切になる場合があります。インデックス付きビューのアプローチにはこの問題はありません。計算された列とインデックスのスペースではなく、インデックスのスペースを消費するだけです。