SQL Server 2008 очень медленно использует FTS для объединенных таблиц - PullRequest
1 голос
/ 02 декабря 2009

У меня есть две таблицы

Product (id int, brandid int,Name nvarchar(1000)) 2+ million rows 
Brand (id int,name nvarchar(1000)) 20k rows

Полный текстовый индекс включен в обоих полях имени таблицы.

Если я сделаю поиск, например

SELECT count(*) 
FROM   Product p join Brand b
         on p.BrandID = b.ID
WHERE  contains(b.name,'calvin')

Работает очень быстро (менее секунды). Тот же результат, если работает с полем p.name.

Но этот запрос

SELECT count(*) 
FROM   Product p join Brand b
         on p.BrandID = b.ID
WHERE  contains(b.name,'calvin')
       OR
       contains(p.Name,'calvin')

занимает больше минуты (на самом деле несколько минут). Если ИЛИ изменено на И, это также очень быстро.

Я не могу использовать союзы или таблицы, так как я использую nhibernate.

1 Ответ

1 голос
/ 02 декабря 2009

Рекомендую прочитать Полнотекстовые запросы SQL Server 2005 для больших каталогов: извлеченные уроки .

Любой запрос с OR является возможным источником проблем с производительностью. ИЛИ между двумя таблицами объединения, это похоже на приглашение к катастрофе, так как оптимизатор в основном потерял любую информацию о том, как оптимизировать объединение. Добавьте условие полного текста, что сделает прогноз кардинальности (количество строк, соответствующих условию) в лучшем случае дикой догадкой, и вы получите идеальный шторм.

Избавьтесь от ИЛИ. Период. Измените ваши требования, откажитесь от посредника (уровни ORM).

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