Полнотекстовый поиск «Содержит» медленнее, чем «Нравится%» - PullRequest
4 голосов
/ 02 ноября 2010

У меня проблема с полнотекстовым индексированием в SQL Server 2008 x64.

У меня есть три таблицы:

Таблица A с 90 000 строк

ТаблицаB с 12 000 000 строк

TableC с 22 000 000 строк

Я создал каталоги FTS с автопопуляцией.

Когда я запрашивал Таблицу A:

Select * from TableA where Contains(field1, '"j*"')

Я вижу 11000 записей менее чем за 1 секунду

Но когда я запросил TableB или TableC с тем же запросом, я вижу 250 записей за 2 секунды. Это очевидно очень медленно.

Запрос с «подобно%» вместо «содержит» выполняется для этих же таблиц менее 1 секунды.

Может ли проблема существовать из-за больших таблиц B и C? Таблица A успешно запрошена.

Может быть, этим таблицам нужно больше времени для индексации? (но они индексируют (заполняют) уже 3 дня)

Некоторые детали:

Для таблиц B и C я всегда вижу «Состояние населения = Обработка уведомлений» (9)

Свойство «TableFulltextDocsProcessed» всегда увеличивается

(Мой SQL Server имеет зеркальный экземпляр.)

1 Ответ

1 голос
/ 12 марта 2011

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

Select * from TableA where Contains(field1, '"j*"')

содержит только символ ' j ', если вы выполняли тот же поиск с

Select field1 from TableA where Contains(field1, 'fish')

по сравнению с

Select field1 from TableA where field1 like '%fish%'

В этой цитате они много говорят о словах, а не о персонажах. Полнотекстовый поиск в SQL Server 2005: внутренние компоненты и улучшения

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

Так что мне интересно, работает ли j *, если фраза: 'j' должна быть словом в языках, с которыми используется полный текст .. увидеть СОДЕРЖИТ (Transact-SQL)

Определяет совпадение слов или фраз начиная с указанного текста. Приложите префикс термина в двойном кавычки ("") и добавить звездочка () перед окончанием кавычка, так что весь текст начиная с простого термина указано перед звездочкой соответствует. Пункт должен быть указано так: СОДЕРЖИТ (столбец, 'Текст"'). Звездочка соответствует нулю, один или несколько символов (корня слово или слова в слове или фразе)

Как выглядят планы выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...