In index max length is 900 bytes anyway, поэтому вы не можете индексировать NVARCHAR (2000).
Более крупный ключ указателя означает, что меньшее количество клавиш соответствует индексным страницам, поэтому оно создает большее дерево, больше использует диск, больше ввода-вывода, больше буфера, меньше кэширования. Для кластеризованных ключей это намного хуже, потому что кластеризованное значение ключа используется как значение поиска для всех других некластеризованных индексов, поэтому оно увеличивает размер всех индексов.
В конечном счете самым распространенным показателем вождения в запросе является количество страниц, отсканированных/искаженных. Это означает физическое чтение (= время ожидания ввода-вывода) или логическое чтение (= загрязнение кеша).
Помимо соображений, связанных с пространством, типы данных практически не влияют на поведение запроса. char/varchar/nchar/nvarchar имеют сопоставления, которые необходимо учитывать при сравнении, но стоимость поиска порядка сортировки обычно не является решающим фактором.
И последнее, но не менее важное, возможно, самый важный фактор, это ваш шаблон доступа к приложению. Индексируйте столбцы, которые обрабатывают запросы SARGable, нет никакой выгоды в том, чтобы поддерживать индекс, который не используется оптимизатором.
И иногда вам приходится учитывать проблемы параллелизма, например, когда вам нужно устранить deadlocks caused by distinct update access path to the same record.
Update после после редактирования
используйте устройство PERSISTED MD5 хэш-столбец:
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
Вы должны быть очень осторожны с вашим ищет, хэш будет дико отличаться для каких-либо различий на входе, т.е. , если вы ищете параметр Ascii вместо Unicode one ...
У вас будет decent collision chance, если ваш стол станет большим.
вам нужно искать или для обеспечения уникальности? –
@Alex Мне нужно обеспечить уникальность, но будем делать только точные совпадения. –
Я бы использовал триггеры. –