Почему запросы SQL FullText замедляются, когда вы ИЛИ?
В SQL Server (2008) у меня есть индекс FullText в двух столбцах, назовите их 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')
= > 1941ms
SELECT *
FROM (Table1 LEFT JOIN Table2 ON Table1.SomeKey=Table2.SomeKey)
WHERE CONTAINS(FirstNames, 'Bob') OR LastNames LIKE '%Bob%'
= > 3201ms
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%'
= > 3ms
Это поведение сохраняется, даже если я перестрою индекс FullText.
FullText обычно намного быстрее, чем запрос LIKE для больших наборов данных на определенном языке, но почему скорости запросов замедляются на порядок, когда я ИЛИ вместе с двумя кластерами FullText?
Ответы
Ответ 1
Помогает ли изменение использования ContainsTable
?
Он сделал здесь Добавление большего количества запросов OR с помощью CONTAINS Приводит запрос на сканирование
И тому же автору (Joe Stefanelli) удалось добиться аналогичного улучшения, изменив предикаты FREETEXT
в сочетании с OR
на FREETEXTTABLE
здесь Полный текстовый запрос SQL Server для нескольких таблиц - почему так медленно?
Ответ 2
Возможно, вам стоит прочитать следующее: Полные текстовые запросы SQL Server 2005 в крупных каталогах: извлеченные уроки.
Ответ 3
Я бы посмотрел план выполнения для каждого из них. Я предполагаю, что вы узнаете об этом немного.
Вот достойная ссылка, которая покажет вам, как отобразить план выполнения, а также некоторые советы по его интерпретации.