我必须根据计算列对相当大的数据集进行排序。 以下是执行排序
的查询的一部分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
似乎是造成这个问题的原因。
知道如何改善这个吗?
答案 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