2010-12-28 6 views
0

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

Вот основы этого:

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 @[email protected]*@[email protected]+1; 
Set @[email protected]*@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>[email protected] AND rowNumber<[email protected] 
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 секунду, когда я использовал, как оператор.

+1

Какая версия SQL Server? –

+0

Что произойдет, если вы берете или выходите? – u07ch

+0

Его на MS SQL 2008. – manik

ответ

0

По моему опыту, функции полного текстового индекса плохо работают в предложении, содержащем оператор «ИЛИ». Мне нужно было получить такое же поведение, настроив мой запрос на использование 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 @[email protected]*@[email protected]+1; 
Set @[email protected]*@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>[email protected] AND rowNumber<[email protected] 
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 
Смежные вопросы