swanrnd
@swanrnd
Издатель HTML5 игр

Как реализовать выборку пользователей в онлайне MS SQL?

Есть таблица на 200 000 записей с такими индексами:
location (ASC), freebonus_day (DESC)
freebonus_day (DESC)
vkid (DESC) - первичный кластер.
arena_win (DESC)
credits (DESC)
exp (DESC)
level (DESC), search_name (DESC)
side (ASC)
win (DESC)
work (DESC)
На всякий случай, дал все индексы.

Выполняем такой запрос:
SELECT TOP 100 vkid, online, side, name, level FROM sw.dbo.users where location=@location and freebonus_day<@next_day and freebonus_day>@prev_day and vkid>-100 order by online DESC;

План запроса: habrastorage.org/files/046/5df/ed2/0465dfed236843f...
(слишком широкий)

Запрос выполняется в среднем за: 0,67 мс, я б считал это нормальным, но такой план запроса навел на мысли, что что-то не так.

Поле online не индексируется, так как оно обновляется раз в несколько секунд.

Сейчас большую часть процессорного времени тратит 2 запроса:
1) этот
2) установка онлайна пользователя ( UPDATE sw.dbo.users SET online=@time WHERE vkid = @vkid;)
Вот наиболее тяжелые запросы:
e0356aff44114af7ba75c7aa40749219.png

Интересует, как можно все это ускорить?
  • Вопрос задан
  • 2528 просмотров
Пригласить эксперта
Ответы на вопрос 1
DimonZ
@DimonZ
В том плане выполнение, который вы привели для поиска используется индекс IX_Users_online, из приведённой вами информации не понятно какие поля в него входят.

Ускорить запрос можно создав специальный индекс под данный запрос.
Скорее всего хорошо подойдёт индекс построенный по полю location, но с included columns, включающими в себя freebonus_day, vkid и online

Можно добавить ещё и остальные поля, которые используются уже в выборке (side, name, level), но это может привести к увеличению размера индекса и замедлению вставки, но зато СУБД не придётся делать дополнительный поиск по PK.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы