SQL Server Полнотекстовый поиск очень медленно - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть хранимая процедура, которая выполняет поиск в таблице, содержащей около 200000+ строк с полным текстом FREETEXT.

Вот ее основы:

declare @searchKey varchar(150)
if @searchKey Is Null OR LEN(@searchKey)=0
    Set @searchKey='""';
Set @searchKey='car';
declare @perPage int
Set @perPage=40
declare @pageNo int
Set @pageNo=1

declare @startIndex int,@endIndex int;
Set @startIndex=@perPage*@pageNo-@perPage+1;
Set @endIndex=@perPage*@pageNo;

Select totalItems
--i pull other colums as well
from (
    Select Row_Number() over(order by CreateDate DESC) As rowNumber
,COUNT(*) OVER() as totalItems
--other columns are pulled as well
from MyTable P 
    Where 
@searchKey='""'
    OR FreeText((P.Title,P.Description),@searchKey)
) tempData
--where rowNumber>=@startIndex AND rowNumber<=@endIndex
where 
rowNumber>=CASE WHEN @startIndex>0 AND @endIndex>0 THEN @startIndex ELSE rowNumber END
AND rowNumber<=CASE WHEN @startIndex>0 AND @endIndex>0 THEN @endIndex ELSE rowNumber END
order by rowNumber

Проблема заключается в ее запускемедленнее, чем хотелось бы.Загрузка страницы занимает около 3 секунд.Эта же страница загружалась менее чем за 1 секунду, когда я использовал оператор like.

1 Ответ

0 голосов
/ 04 августа 2016

По моему опыту, функции полнотекстового индекса не работают хорошо в предложении, которое содержит оператор «ИЛИ».Мне пришлось получить такое же поведение, настроив мой запрос на использование UNION.Попробуйте и посмотрите, сможете ли вы улучшить производительность.

declare @searchKey varchar(150)
if @searchKey Is Null OR LEN(@searchKey)=0
    Set @searchKey='""';
Set @searchKey='car';
declare @perPage int
Set @perPage=40
declare @pageNo int
Set @pageNo=1

declare @startIndex int,@endIndex int;
Set @startIndex=@perPage*@pageNo-@perPage+1;
Set @endIndex=@perPage*@pageNo;

Select totalItems
--i pull other colums as well
from (
    Select Row_Number() over(order by CreateDate DESC) As rowNumber
,COUNT(*) OVER() as totalItems
--other columns are pulled as well
from
( 
 select * from
 MyTable A
    Where 
     @searchKey='""'
UNION
select * from MyTable B
    where FreeText((B.Title,B.Description),@searchKey)
) as innerTable

) tempData
--where rowNumber>=@startIndex AND rowNumber<=@endIndex
where 
rowNumber>=CASE WHEN @startIndex>0 AND @endIndex>0 THEN @startIndex ELSE rowNumber END
AND rowNumber<=CASE WHEN @startIndex>0 AND @endIndex>0 THEN @endIndex ELSE rowNumber END
order by rowNumber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...