2016-10-24 10 views
1

Ich benutze die folgende Abfrage innerhalb einer gespeicherten Prozedur, um das Ranking des Benutzers zu erhalten.Optimieren von Rang() Abfrage

Beim Versuch, die Datenbank zu optimieren, versuche ich festzustellen, ob diese Abfrage optimiert werden kann, da es die am häufigsten verwendete Abfrage in meiner Datenbank ist.

ID-Spalte ist indiziert.

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; 

Gibt es eine Möglichkeit, diese Abfrage zu erhalten, um besser zu funktionieren?

+0

Vorzugsweise möchte ich die höchste Bewertung für den Benutzer erhalten. Wenn Nutzer mit 10-20 Punkten alle 1.000 Punkte erzielt haben, möchte ich 10 als Ergebnis anzeigen. –

+0

@DNOeth das ist, was er will, der "RANK" dieser userId - es ist egal, wer es vor ihm ist, um diesen Rang zu erstellen – Cato

+0

@Dnoeth - Ich habe nur gepostet, weil ich nichts nützliches hinzufügen kann – Cato

Antwort

2

Sie können Ausdruck dies als:

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

Sie würden einen Index für user_rankings(id, score) und user_rankings(score) wollen.

Ich denke, das wird etwas bessere Leistung haben.

+0

Vielen Dank Sie! Ich habe die neuen Indizes noch nicht hinzugefügt, aber die Ausführung der vorherigen Abfrage und der vorgeschlagenen neuen führte dazu: Ursprüngliche Abfrage: SQL Server-Ausführungszeiten: CPU-Zeit = 172 ms, verstrichene Zeit = 349 ms. geändert nach Ihrem Vorschlag: SQL Server-Ausführungszeiten: CPU-Zeit = 32 ms, verstrichene Zeit = 37 ms. –