Существует несколько факторов, играющих большую роль в решении 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;
Вы можете использовать Active Directory или другую реализацию LDAP, если вы находитесь в управляемой среде. Таким образом, группы безопасности, которые определяют разрешения, могут управляться поддержкой первой линии, используя технологию, с которой они, скорее всего, уже знакомы. что в вашем приложении может быть расширяемая модель данных.