Sql serve Полнотекстовый поиск с Containstable очень медленный при использовании в JOIN!
Я использую полнотекстовый поиск sql 2008, и у меня возникают серьезные проблемы с производительностью в зависимости от того, как я использую Contains или ContainsTable.
Вот пример: (в первой таблице содержится около 5000 записей, а в таблице table1 есть закрытый индекс, в котором есть все поля в предложении where. Я попытался упростить операторы, поэтому извините, если есть проблемы с синтаксисом.)
Сценарий 1:
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select top 1 * from containstable(table1,*, 'something') as t2
where t2.[key]=t1.id)
Результаты: 10 секунд (очень медленно)
Сценарий 2:
select * from table1 as t1
join containstable(table1,*, 'something') as t2 on t2.[key] = t1.id
where t1.field1=90
and t1.field2='something'
Результаты: 10 секунд (очень медленно)
Сценарий 3:
Declare @tbl Table(id uniqueidentifier primary key)
insert into @tbl select {key] from containstable(table1,*, 'something')
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select id from @tbl as tbl where id=req1.id)
Результаты: доля секунды (супер быстро)
В итоге, кажется, что если я использую Containstable в любом виде соединения или где условие условия оператора выбора, которое также имеет другие условия, производительность действительно плохая. Кроме того, если вы посмотрите на профилировщик, количество операций чтения из базы данных возрастет. Но если я сначала сделаю полнотекстовый поиск и поместу результаты в табличную переменную и использую эту переменную, все пойдет очень быстро. Количество операций чтения также значительно ниже. Кажется, что в «плохих» сценариях он как-то застревает в цикле, который заставляет его много раз читать из базы данных, но, конечно, я не понимаю почему.
Теперь вопрос, прежде всего, почему это происходит? и вопрос два в том, насколько масштабируемые переменные таблицы? Что, если это приведет к десяткам тысяч записей? это все еще будет быстро.
Есть идеи? Спасибо