Я планирую настроить базу данных для некоторых элементарных агрегатов.План состоит в том, чтобы предоставлять нашим пользователям такие запросы, как SELECT SUM(energy) WHERE
...
energy
- это простое числовое поле.Предложение WHERE
более интересно, потому что мы предоставляем пользователю некоторую (ограниченную) настраиваемость, в основном просто AND
, используя некоторые поля для равенства.Как A=3
, A=3 AND B=92
и т. Д.
Я не администратор базы данных, но мое чувство производительности покалывает.В настоящее время я ожидаю загрузки O(user * record)
в базу данных, если запросы будут выполнены сразу.Есть ли способ оптимизировать это лучше?
Если бы условие WHERE
было исправлено, то мы могли бы просто предоставить представление или иным образом предварительно рассчитать и кэшировать сумму.К сожалению, в этом случае мы будем предоставлять ограниченную возможность настраивать выражение WHERE
, предлагая пользователям по умолчанию некоторые поля для AND
.
Мне кажется, что каждый из этих запросов агрегацииОбход в основном всей таблицы или значительных подразделов таблицы, один обход на пользовательский запрос.Имеет ли это смысл?
Какие есть способы оптимизации для такого типа рабочего процесса?Должен ли я просто осколок многих моих полей?Я рассматриваю, сколько реплик использовать, хотя я не уверен, что |replicas|
сможет опередить рост пользователей или данных из-за совокупности данных запросов агрегации.
С точки зрения низкогона уровне производительности, имеет ли смысл структурировать эти запросы как SELECT SUM(energy)>N WHERE
... и надеяться, что PostgreSQL достаточно умен, чтобы завершить работу раньше, когда будет найдено, что промежуточный итог уже превышает порог N
?
Наконецмогут ли NoSQL или TSDB дать преимущества для этого рабочего процесса, или их производительность будет сопоставима с базой данных SQL?
Обновление
Поскольку большинство этих запросов будут выполнятьсяпо расписанию, я думаю, я потрясу их, чтобы распределить нагрузку в течение дня.Но я все еще стремлюсь найти более эффективные способы оптимизации таблиц для этой нагрузки, если группа активных пользователей внезапно отправит запросы агрегации сразу.