2013-11-25 3 views
3

Моя база данных - MS SQL 2008, и я использую SQL Server Management Studio.Лучший способ индексирования столбца строки для полного сравнения строк

У меня есть поле NVARCHAR (MAX), в котором хранится строка с именем INTERNALDATA, которая хранит данные вроде этого «SOME_NAME: SOME_ID», не спрашивайте меня, почему я просто не делаю другой столбец int с SOME_ID, это как проект был настроен, и я не могу его изменить сейчас.

Так что теперь мне нужно сделать сравнение в этом поле, слава богу, это не сравнение подстроки. Это полное сравнение колонки, как это:

INTERNALDATA = "Bill:5" 

Теперь, как вы можете себе представить, что это очень медленно, то, что индекс я должен использовать или изменить тип столбца, чтобы сделать это быстрее?

PS: Фактические данные, хранящиеся в этом поле, не должны быть длиннее, чем, может быть, 100 символов, возможно, я должен изменить NVARCHAR (MAX) на NVARCHAR (100)?

ответ

0

Прямое индексирование столбца nvarchar(max) невозможно, так как индексный ключ ограничен 900 байтами.

Стол для резки до nvarchar(100) (если известно, что столбец никогда не будет содержать более длинных значений), и его дальнейшая индексация кажется прекрасным решением.

+0

Хорошо, я дам вам поглядеть, насколько это улучшится, спасибо – Bill

0

Одним из распространенных способов индексирования длинных строк для поиска равенства является индексирование хэш-суммы (например, md5), а затем сравнение на как столбцов (исходное сырьевое значение, так и сумма хэша).

В SQL Server вы можете использовать HASHBYTES, например: http://technet.microsoft.com/en-us/library/ms174415.aspx (имеет ограничение на 8000 байт).

Причина сравнения обоих столбцов (оригинал и хэш) заключается в защите от ложных срабатываний в случае возникновения столкновения в хэш-функции. Вы даже можете повысить производительность, используя только часть хеш-значения (не все биты), чтобы уменьшить индекс (пробег зависит от ваших данных).

EDIT

охранение индекса на сумму md5 можно сделать SQL Server с помощью вычисляемого столбца (который индексируется): http://msdn.microsoft.com/en-us/library/ms191250.aspx

Это понятие часто называют function based indexing.

+0

Не работает, если обновление данных, которое я подозреваю в этом случае, будет выполняться время от времени. – Bill

+0

@YongkeBillYu Извините, я думаю, я должен был упомянуть о индексировании на основе функций. Теперь у вас больше смысла для вас? –

+0

Да, теперь больше смысла, спасибо! – Bill

Смежные вопросы