使用大表分页查询的计算列检查性能

时间:2011-09-01 21:30:10

标签: sql performance tsql sql-server-2008 database-performance

我有这个查询要检索(见下文简称)搜索作业数据。我们正在处理大约一百万条记录。

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&gt; 0 它需要不到一秒钟。

有人知道我们如何才能改善这一点吗?

2 个答案:

答案 0 :(得分:0)

  

有人知道我们如何才能改善这一点吗?

将列从计算列更改为“常规”列。在您的测试环境中试用它,看看性能改进是否相同。

答案 1 :(得分:0)

如果列使用非确定性函数,我们采用的方法是在表上定义一个普通列,并添加一个插入/更新触发器来更新该值。通过这种方式,当依赖字段更改或添加新记录时会有轻微的打击,但它不会影响查询性能,因为该列是标准SQL列。它也可以很容易编入索引。