SQL Server - nvarchar (max) полнотекстовый индекс полезен при выполнении точного соответствия? - PullRequest
1 голос
/ 21 декабря 2011

У меня есть столбец в таблице типа nvarchar (max), и есть несколько сценариев, в которых мне нужно выполнить точное сопоставление содержимого этого столбца.

Я знаю, что могу создатьполнотекстовый индекс, который, в общем и целом, насколько я понимаю, разбивает текст на части, позволяя выполнять более эффективные запросы при поиске в строке.Мне было интересно, действительно ли при выполнении точного сопоставления полнотекстовый индекс вообще имеет какое-либо значение с точки зрения повышения производительности?

Есть ли какие-либо лучшие альтернативы?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2012

Я знаю, что это старый вопрос, и я бы прокомментировал ответ JNK, но у меня нет представителя для этого ...

Во-первых, поскольку вы используете Nvarchar, вы 'мы должны быть очень осторожны, чтобы убедиться, что строки, которые сравниваются одинаково в хэше сортировки, одинаково;если вы не используете двоичное сопоставление, этого не произойдет, если ваш хэш-алгоритм не поддерживает Unicode или вы сначала не нормализуете свои строки.Unicode допускает различные представления одних и тех же символов, например, É может быть представлен как кодовая точка U + 00C9 или как кодовая точка U + 0045 (E), за которой следует кодовая точка U + 0301 (с острым сочетанием).

Во-вторых, aАлгоритм криптографического хеширования, такой как MD5, не очень хорошо согласуется с необходимостью, где вы хэшируете производительность, а не безопасность.Вам не нужно тратить столько ЦП на каждую вставку и в начале каждого запроса, и вам не нужно, чтобы ваш индексный ключ был таким большим.Вам нужна почти функция .NET StringComparer.GetHashCode (), которая работает быстро, учитывает символы, которые логически, но не двоично равны, и генерирует небольшой хэш-код, который, следовательно, можно сравнивать очень быстро.К сожалению, MS оставляет за собой право изменить этот алгоритм по своему желанию, который бы испортил все сохраненные хэши.В любом случае, если вы собираетесь использовать CLR, я бы порекомендовал украсть соответствующую реализацию GetHashCode из проекта Mono - их библиотеки классов имеют MIT-лицензию, поэтому вы можете отменить их при желании, если сохраните уведомления об авторских правах в источнике.

3 голосов
/ 21 декабря 2011

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

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

Общая идея будет:

ALTER TABLE MyTable
ADD HashField as HASHBYTES('MD5', LongfieldName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...