子查询性能 - Where子句中的非唯一列

时间:2011-08-24 18:41:29

标签: sql sql-server performance

我有两张桌子

表格工作

[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表上的唯一列。

在这种情况下,我怎样才能提高性能???

1 个答案:

答案 0 :(得分:1)

UDF在某些情况下很棒,但执行计划不会像sprocs那样进行缓存。如果您尝试使用另一个派生表而不是函数,则查询可能会执行得更好。