In index max length is 900 bytes anyway, so dass NVARCHAR (2000) nicht indiziert werden kann.
Ein größerer Indexschlüssel bedeutet, dass weniger Schlüssel in die Indexseiten passen, so dass ein größerer Baum, mehr Datenträger, mehr E/A, mehr Pufferzug, weniger Caching erstellt wird. Bei geclusterten Schlüsseln ist dies viel schlimmer, da der Wert des gruppierten Schlüssels als Suchwert für alle anderen nicht gruppierten Indizes verwendet wird, sodass die Größe der Indizes alle erhöht wird.
Letztendlich ist die am häufigsten verwendete Performance-Metrik in einer Abfrage die Anzahl der gescannten/gesuchten Seiten. Dies führt zu physischen Lesevorgängen (= I/O-Wartezeit) oder logischen Lesevorgängen (= Cache-Verschmutzung).
Abgesehen von den Platzverhältnissen machen Datentypen im Abfrageverhalten wenig bis gar keinen Unterschied. char/varchar/nchar/nvarchar haben Sortierfolgen, die bei Vergleichen berücksichtigt werden müssen, aber die Kosten für die Sortierreihenfolge der Sortierreihenfolge sind normalerweise kein entscheidender Faktor.
Und last but not least, wahrscheinlich der wichtigste Faktor, ist Ihre Anwendung Zugriffsmuster. Indexieren Sie die Spalten, die Abfragen SARGable machen, es ist absolut kein Vorteil, einen Index zu verwalten, der nicht vom Optimierer verwendet wird.
Und manchmal müssen Sie Concurrency-Probleme berücksichtigen, wie wenn Sie deadlocks caused by distinct update access path to the same record beseitigen müssen.
Update nach Post bearbeiten
Verwenden Sie eine persistente MD5-Hash-Spalte:
create table foo (
bar nvarchar(2000) not null,
[hash] as hashbytes('MD5', bar) persisted not null,
constraint pk_hash unique ([hash]));
go
insert into foo (bar) values (N'Some text');
insert into foo (bar) values (N'Other text');
go
select * from foo
where [hash] = hashbytes('MD5', N'Some text');
go
Sie haben mit sehr vorsichtig sein, Ihre sucht, wird der Hash-wild für einen Unterschied in der Eingabe unterscheiden, dh . Wenn Sie Ascii-Parameter statt Unicode eins suchen ...
Sie werden eine decent collision chance haben, wenn Ihr Tisch groß wird.
tun müssen, um Sie suchen oder Eindeutigkeit zu erzwingen? –
@Alex Ich muss Eindeutigkeit erzwingen, aber werde nur genaue Übereinstimmungen machen. –
Ich würde Trigger verwenden. –