У меня есть этот запрос для извлечения (см. Ниже, сокращено для простоты) поиска данных о вакансиях. Мы имеем дело с около миллиона записей.
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
Если я сниму
Где SearchKeyMatchRank> 0
это займет меньше секунды.
Кто-нибудь понял, как мы могли бы улучшить это?