このクエリを使用して、ジョブの検索データを取得します(以下を参照してください。簡単にするために省略します)。約100万件のレコードを扱っています。
Select ID
from
(
Select ID,createDate
,SearchKeyMatchRank
,Row_Number() over(Order By createDate) As rowNumber
from Jobs J
OUTER APPLY
(
Select SearchKeyMatchRank=
CASE WHEN @searchKey='""' THEN 0
ELSE
(Select IsNull([RANK],0) from FREETEXTTABLE(Jobs,title,@searchKey) Where [Key]=J.ID)*4
+(Select IsNull([RANK],0) from FREETEXTTABLE(Jobs,description,@searchKey) Where [Key]=J.ID)*4
+(
select SUM(ISNULL(JS2.[Rank],0))
from FREETEXTTABLE(JobSkills,skill,@searchKey) JS2
Where JS2.[Key] in (Select ID from JobSkills Where jobId=J.Id)
)*2
END
) SMR
Where
SearchKeyMatchRank>0 --simplified here
) T2
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
ノート:
jobIdをREETEXTTABLEに渡して加重ランクを見つける必要があるため、通常の結合を使用できません。
問題:
その非常に遅い。
どうやら問題は計算列を比較することです。
SearchKeyMatchRank>0
Where SearchKeyMatchRank> 0を離陸すると、1秒もかかりません。
誰かがこれをどのように改善できるか考えましたか?