2010-12-28 5 views
0

Ich habe eine gespeicherte Prozedur, die eine Tabelle sucht, die über 200000 Zeilen mit Volltext FREETEXT hat.SQL Server Volltextsuche sehr langsam

Hier sind die Grundlagen davon:

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 

Das Problem seines laufen langsamer ist dann würde ich es mag. Es dauert ungefähr 3 Sekunden, um die Seite zu laden. Die gleiche Seite wurde in weniger als 1 Sekunde geladen, als ich einen ähnlichen Operator verwendete.

+1

Welche Version von SQL Server? –

+0

Was passiert, wenn Sie die oder aus? – u07ch

+0

Es ist auf MS SQL 2008. – manik

Antwort

0

Nach meiner Erfahrung funktionieren Volltext-Index-Funktionen nicht gut in einer Klausel, die einen "ODER" -Operator enthält. Ich musste das gleiche Verhalten erreichen, indem ich meine Anfrage an die Verwendung einer UNION anpasste. Versuchen Sie dies und sehen Sie, ob Sie eine bessere Leistung erzielen können.

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