2017-02-09 9 views
2

У меня есть временная переменная с вычисленным столбцом на основе SHA1 hasbyte. Когда я создаю УНИКАЛЬНЫЙ некрупный индекс на вычисленном столбце, он выдает предупреждение:Внимание! Максимальная длина ключа - 900 байт. Индекс имеет максимальную длину 8009 байт.

Внимание! Максимальная длина ключа - 900 байт. Индекс 'UQ __ # B445E45__954B055AC5951B75' имеет максимальную длину 8009 байт. Для некоторой комбинации больших значений операция вставки/обновления завершится с ошибкой.

Я помню, что считывание байт SHA1 ограничивается примерно 160 байтами. Я не могу понять, почему я получил это предупреждение.

Если вы проверяете максимальную длину всех столбцов, участвующих в вычисляемом столбце, в результате запроса ниже, он составляет около 8148 байт. Но я подумал, что с использованием хэша, который я использую, я должен получить не более 160 байт для вычисленного столбца.

SELECT Sum(c.max_length) 
FROM SYS.COLUMNS C INNER JOIN SYS.TABLES tb ON tb.[object_id] = C. [object_id] 
INNER JOIN SYS.TYPES T ON C.system_type_id = T.user_type_id 
WHERE tb.[is_ms_shipped] = 0 
and OBJECT_NAME(tb.object_id)='xyz' 

Пожалуйста, сообщите, что мне не хватает здесь.

+0

показать нам свою вычисленную колонку? –

+0

@JuanCarlosOropeza Мой вычисленный столбец выглядит следующим образом: CompSum AS HashBytes («SHA1», Col1 + Col2 + Col3 + .. еще 15 столбцов). Все столбцы, включенные в вычисляемый столбец, - varchar (n), где n не более 50 – Ramya

+0

Да, но db этого не знает. Вам нужно включить кастинг, иначе он допустит самый большой 'n' разрешенный –

ответ

2

Im не эксперт по Hash:

Но я предлагаю вам создать столбец combine varchar(750) (15 * 50)

Затем обновить этот столбец с SET combine = Col1+ Col2+ Col3+.. Col15

И попробовать:

CompSum AS HashBytes('SHA1', combine) 

Таким образом, вы используете поле, которое никогда не будет больше 750

+0

На самом деле 'varbinary (20)', вероятно, будет лучшим выбором (попробуйте, и вы поймете, почему). Но я бы, вероятно, сделал 'CompSum AS CONVERT (varbinary (20), HashBytes ('SHA1', col1 + col2 + ...)' вместо добавления дополнительного вычисленного столбца. –

+0

@AaronBertrand да, это работает лучше. предложение, чтобы проверить, не устранит ли это предупреждение. –

+0

@AaronBertrand Да только простой CONVERT устраняет предупреждение! – Ramya