2016-10-24 4 views
1

Я использую следующий запрос в хранимой процедуре, чтобы получить рейтинг пользователя.Оптимизация запроса rank()

При попытке оптимизировать базу данных, я пытаюсь определить, можно ли оптимизировать этот запрос, поскольку это самый используемый запрос в моей базе данных.

столбец идентификатора.

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

Thank вы! Я еще не добавлял новые индексы, но выполнение первого запроса и предлагаемого нового приводило к следующему: Исходный запрос: Время выполнения SQL Server: время процессора = 172 мс, прошедшее время = 349 мс. изменение по вашему предложению: Время выполнения SQL Server: время процессора = 32 мс, прошедшее время = 37 мс. –

Смежные вопросы