Почему партиционирование не решает
Партиционирование по дате уменьшит объём сканирования, если в
WHERE есть дата, но здесь её нет – придётся сканировать все партиции.Материализованное представление (MV)
MV хранит предрассчитанный результат запроса:
SELECT client_id, SUM(amount) as total FROM orders GROUP BY client_id.Занимает места ~ (кол-во клиентов) × (несколько байт).
Обновляется инкрементально после каждого изменения в
orders или по расписанию.Запрос к MV вместо основной таблицы выполняется за миллисекунды (читает всего N строк).
В требованиях нужно указать:
«Для отчёта "топ клиентов" использовать материализованное представление
client_totals».«Обновлять представление раз в час (допустима задержка)».
«При изменении данных (INSERT/UPDATE) в
orders запускать фоновую задачу пересчёта».Реальный пример
В CRM-системе отчёт «крупнейшие покупатели» грузился 30 секунд. После создания MV с ежечасным обновлением время упало до 0.2 секунды.