Size: a a a

Saint P Ruby Community

2021 June 11

w

wi11son in Saint P Ruby Community
ну оно возможно снизит стоимость группировки, но тут основная проблем именно в поиске нужных транзакций
источник

DK

Dmitry Kuznetsov in Saint P Ruby Community
Вряд ли сильно поможет, но индекс же нужен для provider_name, currency. Группировка ведь тоже по индексу работает, если я не ошибаюсь
источник

NB

Nikita Bulai in Saint P Ruby Community
COUNT(*) и COUN(1) - одно и то же . Не путать с SELECT *
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
Зависит от БД, в постгресе вот влияет (хотя может починили уже) — https://blog.jooq.org/2019/09/19/whats-faster-count-or-count1/
источник

DK

Dmitry Kuznetsov in Saint P Ruby Community
а, там вообще группировка миллисекунды занимает
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
а можешь сделать explain analyze?
источник

w

wi11son in Saint P Ruby Community
ща
источник

w

wi11son in Saint P Ruby Community
докинул в гист
источник

w

wi11son in Saint P Ruby Community
уже прогрелось, достаточно быстро отработало
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
А там в компании 147 много транзакций, да? Вообще count по умолчанию медленная штука, он после фильтрации и группировки всё равно пойдет перебирать все, что осталось.
источник

w

wi11son in Saint P Ruby Community
да, там 4млн записей в 147 компании
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
Если точность не нужна, то можно посчитать примерное число через статистику (там хранятся распределения)
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
еще можно вот такую штуку попробовать https://github.com/citusdata/postgresql-hll
источник

w

wi11son in Saint P Ruby Community
я думаю, что в цлом в этой задаче не важна точность, а важны пары, которые были использованы provider_name/currency,
и соответственно правильным решением тут пожалуй будет дистинкт, ну или глянуть через статистику.

Меня больше смущает, что делать дальше в такой ситуации. По этой компании кол-во транзакций будет расти, а любой запрос будет все медленнее и медленнее
источник

P

Paul in Saint P Ruby Community
я бы для такой большой таблицы держал периодические итоги, тогда обсчет сводится к получению итогов на начало периода и обсчета текущих транзакций
источник

DT

Dmitry Tsepelev in Saint P Ruby Community
Ещё опция если счётчиков мало — держать их в редисе и обновлять в фоне раз в период
источник

w

wi11son in Saint P Ruby Community
спасибо, ребзя
источник

AM

Andrey Morozov in Saint P Ruby Community
А что если это в Materialized View положить?
И триггером обновлять данные?
источник

CM

Cucumba Morozov in Saint P Ruby Community
только не слишком часто, а то ООМ произойдёт 🌚
источник

T

Tharin in Saint P Ruby Community
Кэшировать периодически в одну запись.
источник