2016-10-24 6 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位のユーザーがすべて1,000点を獲得した場合、結果として10を表示したいと思います。 –

+0

@dnoethそれは彼が望んでいるものだが、そのuserIdの 'RANK' - 彼はそのランクを作るために彼が先んじている人を気にしない。 – Cato

+0

@dnoeth - 私は何も役に立たないので投稿した。 – Cato

答えて

2

することはできフレーズとして、この:あなたはuser_rankings(id, score)user_rankings(score)にインデックスを望む

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

これはやや優れたパフォーマンスを持つと思います。

+0

君は! 新しいインデックスをまだ追加していませんでしたが、以前のクエリと新しいクエリを実行すると、次のような結果になりました。 元のクエリ: SQL Server実行時間:CPU時間= 172 ms、経過時間= 349 ms。 あなたの提案に応じて変更: SQL Serverの実行時間:CPU時間= 32 ms、経過時間= 37 ms。 –