повысить производительность за postgres - PullRequest
0 голосов
/ 29 мая 2020

Я подсчитываю количество пользователей таким образом, он длится 5 секунд для получения результатов, я ищу лучшее решение

SELECT COUNT(*)
FROM (SELECT user_id
      FROM slot_result_primary
      WHERE session_timestamp BETWEEN 1590598800000 AND 1590685199999
      GROUP BY user_id) AS foo

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Прежде всего, вы можете упростить запрос:

SELECT COUNT(DISTINCT user_id)
FROM slot_result_primary
WHERE session_timestamp BETWEEN 1590598800000 AND 1590685199999

Самое главное - убедитесь, что у вас есть индекс по sesion_timestamp

0 голосов
/ 29 мая 2020

Подсчет - очень тяжелая операция в Postgres. По возможности этого следует избегать. Очень сложно сделать это лучше, поэтому для каждой строки Postgress нужно go, а для каждой строки c. Вы действительно можете создать лучший индекс, чтобы выбирать, какие строки выбирать из диска c быстрее, но даже с этим временем счета всегда будет go за линейное время по сравнению с размером данных.

Ваш индекс должен быть:

CREATE INDEX session_timestamp_user_id_index ON slot_result_primary (session_timestamp, user_id)

для достижения наилучших результатов.

Тем не менее, индекс не решит ваши проблемы с подсчетом полностью. В аналогичной ситуации я столкнулся два дня с go (с запросом SELECT, выполняющим 3 с, а счетчик - с 1 с), выделенные индексы позволяли pu sh сократить время выбора до 0,3 мс, но лучшее, что я мог сделать со счетчиком, было 700 мс .

Здесь вы можете найти хорошую статью с кратким изложением того, почему счетчик сложен, и различные способы его улучшения: https://www.citusdata.com/blog/2016/10/12/count-performance/

...