2009-07-23 5 views
16

Что такое разница (и преимущества/недостатки) между полным текстом и регулярным индексом в столбце varchar? Когда я буду использовать этот индекс?SQL Server: нормальный индекс против индекса Fulltext

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

Спасибо!

ответ

19

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

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

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

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

Вы можете использовать полнотекстовый индекс совершенно по-разному:

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

Есть ли какая-либо причина не использовать полный текст? – Alex

+0

Они используют много дискового пространства и не спешат пересчитывать. –

+1

Удивительное упоминание - я чувствую, что этого недостаточно. – AndrewPK

8

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

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

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

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

Марк

+1

+1 для обозначения практических причин, почему нужно делать индекс FULLTEXT, а просто комментируя синтаксис и совместимые операции. – dayuloli

3

От MSDN:

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

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