Я использую этот запрос для выборки ранга пользователя из Sql Server БДА:Оптимизировать ранг запрос
select user_rank
from (select t.user_id, rank() over (order by score desc) as user_rank
from user_stats t
) t
where t.user_id='some_user_id';
таблица состоит около 22000 строк и запрос занимает 3,5 секунды, что является слишком медленным.
Есть несколько индексов на этой таблице, это соответствующая:
user_id - уникальный, NONCLUSTERED INDEX
счет - Неуникальная, NONCLUSTERED INDEX
Если изменить идентификатор запроса и использования (который является моим первичным ключом) вместо user_id, то запрос выполняется быстро:
select user_rank
from (select t.id, rank() over (order by score desc) as user_rank
from user_stats t
) t
where t.id='some_id';
После проверки плана выполнения я вижу, что стоимость сканирования кластеризованного индекса составляет 92%, хотя я не понимаю, почему это необходимо в этом случае.
Что можно сделать для оптимизации этого запроса?
Статистика запроса:
SQL-сервера и разбора во время компиляции: процессорного времени = 0 мс, прошло время = 0 мс.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 0 мс. Время и время компиляции SQL Server: время процессора = 0 мс, прошедшее время = 0 мс.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 0 мс. Время и время компиляции SQL Server: время процессора = 0 мс, прошедшее время = 0 мс.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 0 мс. Время и время компиляции SQL Server: время процессора = 0 мс, прошедшее время = 0 мс.
(1 ряд (-ых) затронутых) Таблица 'users_stats'. Количество сканирования 1, логический считывает 22529, физических чтений 0, упреждающего чтения читает 0, Лоб логического чтения 0, Лоб физической читает 0, лоб упреждающего чтения читает 0.
(1 строку (ы) пострадавших)
Время выполнения SQL Server: время процессора = 78 мс, прошедшее время = 3576 мс. Время и время компиляции SQL Server: время CPU = 0 мс, прошедшее время = 0 мс.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 0 мс.
Вы собираетесь не иметь развертку здесь, независимо от того, что, потому что ваш подзапрос должен смотреть на каждую строку таблицы. Не уверен, почему это будет 3,5 секунды, но без определения таблиц и индексов это только предположение. –
Если идентификатор пользователя уникален, то какова цель ранжирования одного пользователя? –
Но почему существует такая разница между использованием user_id и id, поскольку они оба индексируются? –