2016-10-24 30 views
1

我在存儲過程中使用以下查詢來獲取用戶的排名。優化rank()查詢

雖然試圖優化數據庫,我試圖確定此查詢是否可以優化,因爲它是我的數據庫中最常用的查詢。

id列被索引。

SELECT 
    @p_rank = all_time_rank 
FROM 
    (SELECT 
     user_rankings.*, 
     RANK() OVER (ORDER BY score DESC) AS all_time_rank 
    FROM 
     user_rankings) t 
WHERE 
    id = @p_id; 

有沒有什麼辦法讓這個查詢執行得更好?

+0

最好我想獲得用戶的最高排名。如果用戶排名10-20,全部拿下1000分,我想顯示10。 –

+0

@dnoeth這就是他想要的,但是,該用戶的'RANK' - 他不在乎誰在他前面創建該等級 – Cato

+0

@dnoeth - 我只發佈,因爲我無法添加任何有用的內容 – Cato

回答

2

你可以這句話爲:

SELECT @p_rank = COUNT(*) + 1 
FROM user_rankings ur 
WHERE ur.score > (SELECT ur2.score FROM user_rankings ur2 WHERE ur2.id = @pid); 

你想在user_rankings(id, score)user_rankings(score)的索引。

我認爲這會有更好的表現。

+0

感謝您! 我還沒有添加新的索引,但執行前一個查詢和建議的新索引導致如下: 原始查詢: SQL Server執行時間:CPU時間= 172 ms,耗用時間= 349 ms。 根據您的建議修改: SQL Server執行時間:CPU時間= 32毫秒,經過時間= 37毫秒。 –