2011-08-29 105 views
2

我必須根據計算列對相當大的一組數據進行排序。 這裏是做排序按計算列排序時的性能

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

無關您的問題,而是'NULL'是永遠等於SQL什麼,所以你的謂詞上半年是多餘的。 –

+0

從下面的評論。 「我們正在使用一個選擇查詢,沒有任何物理表,內存上的所有內容」。 **如果不是桌子,那麼**是什麼? –

回答

0

你可以使計算列部分的選擇語句,只是無視它?

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

我們不能這樣做,因爲我們需要使用行號進行分頁。 – manik

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 
+0

我們正在使用一個沒有任何物理表的選擇查詢。記憶中的一切。對不起,我應該提到這一點。 – manik