У нас есть широкая таблица, которую мы в настоящее время пытаемся оптимизировать. Таблица имеет 50 столбцов (статистика), которые мы в конечном итоге хотим ранжировать в порядке убывания. В настоящее время насчитывается более 5 миллионов строк.Оптимизация индексов для ранжирования в SQL Server
Мы ищем способы оптимизации этой таблицы как с точки зрения сокращения сложности, так и для повышения скорости чтения. Скорость записи также важна для нас, но чтение более критично. Ранжирование этих статистических данных должно быть максимально приближенным к реальному времени, при этом оптимальным решением является тот, который быстро устанавливается на основе запроса (новые строки все время добавляются, и мы хотим как можно скорее показать ранги для этих строк .)
В настоящее время мы оцениваем, будет ли вертикальная таблица компоновкой.) Более результативной и b) легче работать.
Поскольку статистика, что в настоящее время, вставленная не обязательно четко определена, это легче для нас, если они не жестко закодированы в таблицу (отсюда предпочтение вертикальной структуры таблицы.)
Вот взгляд на наша текущая структура таблицы и запрос:
CREATE TABLE Stats
(
Id BIGINT PRIMARY KEY NOT NULL,
UserId INT,
Name VARCHAR(32) NOT NULL,
Value DECIMAL(10,4) DEFAULT ((0)) NOT NULL,
UpdatedAt DATETIME
);
CREATE INDEX Leaderboard__index ON Stats (Name, Value DESC);
SELECT
Id,
Name,
Value,
RANK() OVER (PARTITION BY Name ORDER BY Value DESC) AS Rank
FROM
Stats
ORDER BY
Value DESC
Обычно мы бы либо искать для верхних N строк для любого данного стата (как лидеры), или мы будем выбирать один UserId и получить ранг всех статистика, связанная с этим UserId.
Данные значительных размеров (как я уже упоминал выше, потому что есть много строк и много колонн, вертикальная структура таблицы может находиться в диапазоне от 250 миллионов строк, и будет продолжать расти.)
Мы стремимся получать эти данные как можно быстрее, независимо от того, какое оборудование требуется, секунды - наша цель, так как мы сейчас находимся в диапазоне минут.
В испытании вертикальной структуры таблицы мы вставленная более 400 000 строк данных и запрос выше, занимает немного меньше чем за 3 минуты (хотя это также потребовалось всего около 18 секунд меньше, чтобы ранжировать 10000 строк.)
Я хотел бы услышать любые предложения. Спасибо за ваше время!
Вы можете обновить свои тэги с версией SQL Server, а также указать, какое издание вы используете (стандартное, корпоративное и т. Д.)? Ta. –
Исходя из вышесказанного, я бы рекомендовал создать другую таблицу, которая поддерживала бы, скажем, 100-го списка пользователей рейтинга с наименьшим количеством баллов. Это значительно уменьшит размер данных, но не позволит ранжировать пользователей за пределами топ-100. – Alex
@Alex. Извлечение лучших 10 000 строк занимает всего пару сотен миллисекунд в оба конца с сервера. Дизайн верхней таблицы N для нас проблематичен, потому что - основанный на нашем дизайне пользовательского интерфейса - тривиально перейти от просмотра 100 лучших к просмотру 100 строк со смещением 100 000. – lwansbrough