Я использую полнотекстовый поиск sql 2008, и у меня возникают серьезные проблемы с производительностью в зависимости от того, как я использую Contains или ContainsTable.
Вот пример: (в таблице 1 содержится около 5000 записей, а в таблице1 есть закрытый индекс, который имеет все поля в предложении 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 в любом виде соединения или условия условия предложения оператора select, которое также имеет другие условия, производительность действительно плохая. Кроме того, если вы посмотрите на профилировщик, количество считываний из базы данных поступает на крышу. Но если я сначала сделаю полный текстовый поиск и поместил результаты в переменную таблицы, а с этой переменной все будет очень быстро. Количество чтений также значительно ниже. Кажется, что в "плохих" сценариях он каким-то образом застревает в цикле, что заставляет его читать много раз из базы данных, но, конечно, я не понимаю, почему.
Теперь вопрос в первую очередь, почему это происходит? а второй вопрос заключается в том, как масштабируемые переменные таблицы? что, если это приведет к 10 тысячам записей? все еще будет быстро.
Любые идеи? Благодаря