Мой ответ не использует коллекции numpy или python.
Один тривиальный способ найти элементы:
a = [-2, 1, 5, 3, 8, 5, 6]
b = [1, 2, 5]
c = [i for i in a if i in b]
Недостаток: этот метод может не быть работайте для больших списков. Использование numpy рекомендуется для больших списков.
Существует несколько факторов, играющих большую роль в решении 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;