Часто жалуются, что count (*) в PostgreSQL очень медленный.
В этой статье я хочу изучить варианты, чтобы вы получили результат как можно быстрее.
Почему count (*) такой медленный?
Большинство людей без проблем понимают, что следующий запрос будет выполняться медленно:
SELECT count(*)
FROM /* сложный запрос */;
В конце концов, это сложный запрос, и PostgreSQL должен вычислить результат, прежде чем узнает, сколько строк он будет содержать.
Но многие люди потрясены, когда узнают, что следующий запрос медленный:
SELECT count(*) FROM large_table;
Тем не менее, если вы подумаете еще раз, все вышесказанное остается в силе: PostgreSQL должен вычислить результирующий набор, прежде чем сможет его посчитать. Поскольку в таблице не хранится «магический счетчик строк» (как в MyISAM MySQL), единственный способ подсчитать строки — это просмотреть их.
Поэтому count (*) обычно выполняет последовательное сканирование таблицы, что может быть довольно дорого.