Попробуйте добавить частичный индекс , как показано ниже:
CREATE INDEX core_event_start_time_recent_idx ON core_event (start_time)
WHERE start_time >= '2011-01-12 0:0'::timestamptz
Это создаст сравнительно небольшой индекс. Создание индекса займет некоторое время, но такие запросы будут намного быстрее после этого.
SELECT count(*) FROM core_event WHERE start_time >= now();
Эффективность этого индекса для запросов против now()
будет медленно снижаться с течением времени, в зависимости от того, сколько новых строк поступает. Обновите (= отбросьте и создайте) индекс с более поздней отметкой времени, иногда отключенной ч.
Вы можете автоматизировать это с помощью функции plpgsql, которую вы вызываете за cronjob или pgAgent .
Вы можете попробовать и посмотреть, улучшит ли выполнение CLUSTER
на столе (если это не противоречит другим требованиям в вашей БД):
CLUSTER core_event USING core_event_start_time;
Да, кластер на полном индексе, а не на частичном. Это займет некоторое время и потребует эксклюзивной блокировки, поскольку эффективно перезаписывает таблицу. Это также эффективно пылесосит стол полностью. Об этом читайте в руководстве .
Вы также можете увеличить статистическую цель на core_event.start_time
;
ALTER core_event ALTER start_time SET STATISTICS 1000; -- example value
По умолчанию просто 100. Тогда:
ANALYZE core_event;
Или, конечно, все обычные рабочие характеристики тоже применимы .