按计算列排序时的性能

时间:2011-08-29 17:22:22

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我必须根据计算列对相当大的数据集进行排序。 以下是执行排序

的查询的一部分
Select Row_Number() over(Order By 
        CASE WHEN @sortBy Is Not Null AND @sortBy='relevance' 
        THEN 
            aRank*0.4+bRank*.2+cRank*.4 
        END DESC
        ,CASE WHEN @sortBy Is Not Null AND @sortBy='date' THEN CreateDate END DESC
        ) As rowNumber
......
from X
OUTER APPLY
    (
        Select SkillMatchRank...........
    ) SMR
Where 
SkillMatchRank>0

问题是这种情况非常缓慢。

我的观察:
SkillMatchRank > 0似乎是造成这个问题的原因。

知道如何改善这个吗?

3 个答案:

答案 0 :(得分:2)

查看执行计划,了解您的问题所在。如果是计算值,您可以考虑在表中创建计算列,或者创建索引视图。

这两种都是数据的持久形式,这意味着它实际占用空间,因为计算的值是预先存储的,而不是在运行时计算的。

以下是一些链接,可帮助您开始了解执行计划:

答案 1 :(得分:0)

你可以将select语句的计算列作为一部分而忽略它吗?

select row_number(), computedcol = aRank*0.4+bRank*.2+cRank*.4
ORDER BY
computedcol

答案 2 :(得分:0)

可以在内存中的表上建立索引,如果要在具有大量行数的表上添加rownumber,则需要索引。否则,您将遇到非常慢的响应时间,或者在最坏情况下甚至可能在内存不足时失败。

你可以在内存表中尝试这样的东西吗?直到明天我才能访问数据库

Alter table <yourtable> add column sortrank cast(arank*.4 + brank*.2 + crank*.4 as real)

CREATE NONCLUSTERED INDEX Idx1 ON <yourtable>(SortRank);

CREATE NONCLUSTERED INDEX Idx2 ON <yourtable>(CreateDate);

Select Row_Number() over(Order By CASE WHEN @sortBy='relevance' THEN Sortrank END DESC 
,CASE WHEN @sortBy='date' THEN CreateDate END DESC) As rowNumber