Есть несколько факторов, играющих большую роль в решении PostgreSQL о том, как выполнять count()
, но, во-первых, столбец, который вы используете внутри функции count
, не имеет значения.На самом деле, если вам не нужен счет DISTINCT
, придерживайтесь count(*)
.
. Вы можете попробовать следующее, чтобы запустить сканирование только по индексу:
SELECT count(*) FROM (SELECT event_id FROM events) t;
..Если это все равно приводит к последовательному сканированию, то, скорее всего, индекс не намного меньше самой таблицы.Чтобы по-прежнему видеть, как будет выполняться сканирование только по индексу, вы можете принудительно выполнить его с помощью:
SELECT count(*) FROM (SELECT event_id FROM events ORDER BY 1) t;
ЕСЛИ это не намного быстрее, вам также следует подумать об обновлении PostgreSQL по крайней мере до версии 9.6, котораявводит параллельное последовательное сканирование , чтобы ускорить эти вещи.
Кроме того, вы можете добиться значительного ускорения, выбирая из множества методов, чтобы обеспечить подсчет, который в значительной степени зависит от вашего варианта использования и ваших требований:
И последнее, но не менее важное: всегда предоставляйте вывод расширенного объяснения в виде уже рекомендованного @a_horse_with_no_name, например:
EXPLAIN (ANALYZE, BUFFERS) SELECT count(event_id) FROM events;