Здесь очень похожая тема:
Медленный выбор отдельного запроса на postgres
Если вы знаете минимальные / максимальные даты, лучше выполнить запрос по списку дат, чем выполнять последовательное сканирование всей таблицы. Предполагая, что у вас есть индекс для записи, что-то, что выглядит так, должно быть быстрее:
with days as (
select date_trunc('day', min(recorded))::date + k * interval '1 day' as day
from records,
generate_series(0,
(select date_trunc('day', max(recorded))::date
- date_trunc('day', min(recorded)::date
from records
)) as k
)
select day
from days
where exists (
select 1
from records
where day <= recorded and recorded < day + interval '1 day'
);
Возможно, есть несколько настроек для вышеупомянутого запроса, но общая идея такова: быстрее выполнить несколько тысяч проверок подзапросов / индексов на индексированном поле, чем сканировать несколько миллиардов строк и объедините их, чтобы определить отдельные дни.