Обычно нам нужны 30 дней старых вещей.
Это та часть вашего вопроса, которая на самом деле актуальна. Postgresql при правильном использовании не должен иметь никаких проблем при выполнении простого WHERE
запроса с десятками миллионов строк. Стоимость поиска индекса растет логарифмически.
Чтобы сделать удар в темноте: если вы выполняете вычисления даты для каждой строки в своем выражении WHERE, производительность действительно будет ужасной. Например:
SELECT * FROM my_data WHERE AGE(CREATED_AT) > INTERVAL '30 days';
... это довольно плохая идея. Вместо этого рассчитайте дату отсечения один раз и статически используйте ее в сравнении.
Если ваш запрос действительно более сложный, вы также можете посмотреть на expression indices
. В приведенном выше примере это излишне, и оно добавляет некоторые накладные расходы ко всем операциям изменения данных, но делает запрос так же, как приведенный выше, а также статический вариант.
В любом случае: EXPLAIN SELECT ...
ваш друг, и публикация его результатов сделает вас еще больше друзьями здесь.