У меня есть две таблицы
Задания таблицы
[ID] [int] IDENTITY(1,1) NOT NULL,
[title] [varchar](150) NULL,
[description] [text] NULL
Table JobSkills
[id] [int] IDENTITY(1,1) NOT NULL,
[jobId] [int] NULL,
[skill] [varchar](150) NULL
Показанный выше частичный список столбцов.
Для таблицы JobSkills я проиндексировал jobIdстолбец, столбец навык полнотекстового индексирования.
У меня есть хранимая процедура, чтобы получить список заданий.вроде как.
Select totalItems
,Id,title
from
(
Select Row_Number() over(Order By
CASE WHEN @sortBy Is Not Null AND @sortBy='relevance'
THEN
SkillMatchRank
END DESC
,CASE WHEN @sortBy Is Not Null AND @sortBy='date' THEN CreateDate END DESC
) As rowNumber
,COUNT(*) OVER() as totalItems
,ID,createDate,title
from Jobs J
OUTER APPLY dbo.GetJobSkillMatchRank(J.ID,@searchKey) As SkillMatchRank
Where
--where conditions here
) tempData
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
Я создал встроенную табличную функцию для получения ранга соответствия навыка.
CREATE FUNCTION [dbo].[GetJobSkillMatchRank]
(
@jobId int,
@searchKey varchar(150)
)
RETURNS TABLE
AS
RETURN
(
select SUM(ISNULL(JS2.[Rank],0)) as rank
from FREETEXTTABLE(JobSkills,skill,@searchKey) JS2
Where JS2.[Key] in (Select ID from JobSkills Where jobId=@jobId)
)
GO
Задача
Запрос выполняется очень медленно,больше минуты.
Мое наблюдение
Для табличной функции, если я установлю jobId = 1 (у меня есть задание с id = 1), то она будет работать очень быстро, как нужно.Я понимаю, что jobId не является уникальным столбцом в таблице JobSkills.
В этом случае, как я могу улучшить производительность ???