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

Когда вы должны использовать полнотекстовую индексацию?

У нас есть целая куча запросов, которые "ищут" для клиентов, клиентов и т.д. Вы можете искать по имени, электронной почте и т.д. Мы используем инструкции LIKE следующим образом:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

Помогает ли полнотекстовая индексация в сценарии? Мы используем SQL Server 2005.

4b9b3361

Ответ 1

Это будет зависеть от вашей СУБД. Я считаю, что большинство систем не будут использовать полнотекстовый индекс, если вы не используете полнотекстовые функции. (например, MATCH/AGAINST в mySQL или FREETEXT/CONTAINS в MS SQL)

Вот хорошая статья о том, когда, почему и как использовать полнотекстовую индексацию в SQL Server: Общие сведения о полнотекстовом индексировании SQL Server

Ответ 2

FTS может помочь в этом сценарии, вопрос в том, стоит ли это или нет.

Для начала рассмотрим, почему LIKE может быть не самым эффективным поиском. Когда вы используете LIKE, особенно когда вы начинаете поиск с % в начале вашего сравнения, SQL Server должен выполнять как проверку таблицы каждой строки, так и байтовую проверку столбца, которую вы проверяете.

У FTS есть несколько лучших алгоритмов для сопоставления данных, так же как и некоторые лучшие статистические данные об изменениях имен. Поэтому FTS может обеспечить лучшую производительность для соответствия Smith, Smythe, Smithers и т.д., Когда вы ищете Smith.

Однако использование FTS немного сложнее, так как вам нужно овладеть CONTAINS vs FREETEXT и тайным форматом поиска. Однако, если вы хотите выполнить поиск, где совпадают имена FName или LName, вы можете сделать это с помощью одного оператора вместо OR.

Чтобы определить, будет ли FTS эффективнее, определите, сколько у вас данных. Я использую FTS в базе данных из нескольких сотен миллионов строк и получаю реальную выгоду от поиска с помощью LIKE, но я не использую его для каждой таблицы.

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

Ответ 3

Согласно моему сценарию тестирования:

  • SQL Server 2008
  • 10.000.000 строк каждая со строкой типа "wordA wordB wordC... "(варьируется от 1 до 30 слов)
  • выбор count (*) с CONTAINS (столбец, "wordB" )
  • размер результата несколько сотен тысяч
  • размер каталога около 1,8 ГБ

Полнотекстовый индекс находился в диапазоне от 2 секунд, тогда как "% wordB%" находился в диапазоне 1-2 минут.

Но это считается только в том случае, если вы не используете никаких дополнительных критериев выбора!. если бы я использовал некоторый "как" префикс% '"в столбце первичного ключа, производительность была хуже, так как операция перехода в полнотекстовый индекс стоила больше, чем выполнение строкового поиска в некоторых полях (пока это не слишком много).

Поэтому я бы рекомендовал полнотекстовый индекс только в тех случаях, когда вам нужно выполнить "поиск свободной строки" или использовать некоторые из его особенностей...

Ответ 4

Чтобы ответить на вопрос специально для MSSQL, полнотекстовое индексирование поможет НЕ в вашем сценарии.

Чтобы улучшить этот запрос, вы можете выполнить одно из следующих действий:

  • Настройте полнотекстовый каталог в столбце и используйте функцию CONTAINS().
  • Если вы в основном выполняли поиск с помощью префикса (т.е. совпадающего с начала имени), вы можете изменить предикат на следующий и создать индекс над столбцом.

    где fname как 'prefix%'

(1), вероятно, слишком велико для этого, если производительность запроса не является большой проблемой.