我有两张桌子
表格工作
[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,我已将indexId列编入索引,列技能已全文索引。
我有一个存储过程来获取作业列表。有点像这样。
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表上的唯一列。
在这种情况下,我怎样才能提高性能???
答案 0 :(得分:1)
UDF在某些情况下很棒,但执行计划不会像sprocs那样进行缓存。如果您尝试使用另一个派生表而不是函数,则查询可能会执行得更好。