devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻

Есть ли возможность в postgres сделать индекс для count запросов?

Цель - сделать быстрыми запросы вида
`SELECT COUNT(*) FROM table WHERE column > value AND column < value2`
в частности - строить графики распределения записей по дате создания и другим полям, сейчас такие запросы на таблице размеров в 60 млн записей выполняются невероятно долго(до часа, т.к. постгрес перебирает все записи в индексе, что удовлетворяют условию).

Теоретически, нет проблем хранить количество в индексе, например в бинарном дереве и тогда выбор `WHERE timestamp > N AND timestamp < M` будет занимать log(N), что очень хорошо.

Есть ли возможность как-то сделать такие вопросы быстрыми, пускай и не максимально точными?
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 3
@SanSYS
Как написали выше - желательно такое аггрегировать заранее - в фоне

Но триггеры с записью для этого не оч подходят, имхо, т.к. каждый раз придётся дописывать код записи, а не новые привычные всем запросы
Для PostgreSQL существует расширение PipelineDB, как им пользоваться можете почитать тут https://habr.com/ru/post/432512/, это похоже именно на то, что вам нужно

А вообще, если данные растут инкрементально, то может стоит рассмотреть индекс BRIN https://habr.com/ru/company/postgrespro/blog/346460/ ?
Весить он будет мало, а работать - вполне достойно, но доку читать внимательно
И.. 60 лямов записей ни о чём не говорит, без информации о размере таблицы и её структуре. Связано с особенностями хранения/чтения

Или ещё вариант - пробовать столбцовые БД ;)
Ответ написан
@rPman
Один из общих способов решения, если изменений в базе значительно меньше чем запросов на чтение - собирать необходимые данные тригерами в отдельную табличку, и делать запросы уже в нее.

p.s. индексы там и так используются, единственное, попробуйте вместо count(*) использовать count(индексируемое поле, используемое в where)
Ответ написан
TheRonCronix
@TheRonCronix
1. Выше верно указали, что нужны агрегаты. Агрегаты могут быть частичными. Если count у вас без distinct, то показатель будет аддитивным и проблем с суммированием по агрегатам быть не должно.
2. Раз у вас таблица так растет нужно ее секционировать. Скорее всего по дате.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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