2010-12-28 31 views
0

私はフルテキストFREETEXTで約200000以上の行を持つテーブルを検索するストアドプロシージャを持っています。その後、私はそれをしたいと思い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

私の経験では、フルテキストインデックス関数は、 "OR"演算子を含む節でうまく機能しません。私は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 
関連する問題