Подтвердить что ты не робот

SQL Server: нормальный индекс против индекса Fulltext

В чем именно разница (и преимущества/недостатки) между полным текстом и регулярным индексом в столбце varchar? Когда я буду использовать какой индекс?

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

Спасибо!

4b9b3361

Ответ 1

Это зависит от вида поиска, который вы хотите сделать. Например, вы не можете использовать обычный индекс с этим запросом:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%'

Это не sargable. Это невозможно, но selectivity может быть не очень хорошим:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%'

Полнотекстовый индекс полностью отличается:

SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText)

Ответ 2

Обычно при поиске с нормальным индексом вы можете искать только в одном поле, например. "найти все города, начинающиеся с буквы А" или что-то в этом роде.

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

Кроме того, при обычном поиске вы достаточно ограничены в том, что вы можете сделать - вы можете искать точное совпадение или просто LIKE - об этом.

С полнотекстовым индексом вы можете искать словоформы (run, run и т.д.), а также для похожих слов, указав свой собственный тезаурус. Если это проблема, вы можете искать на нескольких языках. Вы можете искать записи, в которых есть два или более терминов, которые "НИКОГДА" друг к другу.

Марк

Ответ 3

Из MSDN:

В отличие от полнотекстового поиска предикат LIKE Transact-SQL работает только с шаблонами символов. Кроме того, вы не можете использовать предикат LIKE для запроса форматированных двоичных данных. Кроме того, запрос LIKE для большого количества неструктурированных текстовых данных намного медленнее, чем эквивалентный полнотекстовый запрос по тем же данным.

Запрос LIKE для миллионов строк текстовых данных может занять несколько минут; тогда как полнотекстовый запрос может принимать только секунды или меньше против одних и тех же данных, в зависимости от количества возвращаемых строк.