В SQL Server (2008), я имею Полнотекстовый индекс на двух столбцах, называю их Table1.FirstNames
и Table2.LastNames
. После профилирования некоторых запросов я придумал следующие результаты:
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob') OR CONTAINS(LastNames, 'Bob')
=> 31 197 мс
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE (FirstNames LIKE '%Bob%') OR CONTAINS(LastNames, 'Bob')
=> 1 941 мс
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob') OR LastNames LIKE '%Bob%'
=> 3 201 мс
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob')
=> 565 мс
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE FirstNames LIKE '%Bob%'
=> 670 мс
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(LastNames, 'Bob')
=> 17 мс
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE LastNames LIKE '%Bob%'
=> 3 мс
Это поведение сохраняется, даже если я восстанавливаю Полнотекстовый индекс.
FullText обычно намного быстрее, чем ПОДОБНЫЙ запрос по большим наборам данных на определенном языке, но почему скорости запроса замедляются порядком величины когда я ИЛИ вместе два FullText clasues?
Помогает ли переход на использование ContainsTable
?
Это помогло здесь Добавление дополнительных поисковых запросов OR с CONTAINS приводит к сканированию
И тому же ответчику ( Джо Стефанелли ) удалось добиться аналогичного улучшения, изменив предикаты FREETEXT
в сочетании с OR
на FREETEXTTABLE
] здесь Полнотекстовый запрос SQL Server по нескольким таблицам - почему он такой медленный?
Я бы посмотрел на план выполнения для каждого из них. Думаю, вы многому научитесь из этого.
Вот достойная ссылка , которая покажет вам, как отображать план выполнения, а также некоторые советы по его интерпретации.
Возможно, вам стоит прочитать следующее: Полнотекстовые запросы SQL Server 2005 к большим каталогам: извлеченные уроки .