Нельзя сделать NVARCHAR(MAX)
частью ключа в простом B-Tree
индексе (вы все равно можете использовать его как включенный столбец в индексе).
В противном случае объем хранилища будет таким же, пока данные в столбце не превышают пороговое значение размера строки.
Поскольку вы, вероятно, в любом случае не собираетесь индексировать это поле, рекомендуется создать его как NVARCHAR(MAX)
.
Даже если вы все еще хотите проиндексировать его (скажем, выполнить поиск по префиксу, используя LIKE
), вы можете создать вычисляемый столбец NVARCHAR(450)
, создать индекс для этого столбца и добавить его в свои запросы для грубой фильтрации. .
Смотрите эту запись в моем блоге для более подробной информации:
Если вы собираетесь выполнять точный поиск только для маленьких столбцов, создайте вычисляемый столбец, проиндексируйте его и запросите так:
ALTER TABLE History ADD HistoryDetailsIndex AS SUBSTRING(HistoryDetails, 1, 50)
CREATE INDEX ix_mytable_typeid_details ON History (HistoryTypeId, HistoryDetailsIndex) INCLUDE (HistoryDetails)
SELECT COUNT(*)
FROM History
WHERE HistoryTypeId = 123
AND HistoryDetailsIndex LIKE 'string_prefix_up_to_50_characters%'
AND HistoryDetails = 'string_prefix_up_to_50_characters_plus_everything_after_it'
Это будет включать в себя только первые 50
символов из вашего HistoryDetails
в индексном ключе (который будет найден в условии LIKE
) и все в включенном столбце.
Если вы абсолютно уверены, что никогда не будете искать строку длиной более 50
символов, вы можете опустить включенный столбец и просто использовать это:
SELECT COUNT(*)
FROM History
WHERE HistoryTypeId = 123
AND HistoryDetailsIndex = 'string_prefix_up_to_50_characters'
Это сделает индекс короче.
Однако это не удастся, если вы предоставите строку длиной более 50
символов, поэтому используйте ее, если вы абсолютно уверены, что никогда не будете искать длинные строки.