Това, от което се нуждаете, е „пропускане на сканиране“ или „разхлабено сканиране на индекс ". Планировчикът на PostgreSQL все още не ги прилага автоматично, но можете да го подмамите да използва такъв, като използвате рекурсивна заявка.
WITH RECURSIVE t AS (
SELECT min(eventtype) AS eventtype FROM allevents
UNION ALL
SELECT (SELECT min(eventtype) as eventtype FROM allevents WHERE eventtype > t.eventtype)
FROM t where t.eventtype is not null
)
select eventtype, (select max(eventtime) from allevents where eventtype=t.eventtype) from t;
Може да има начин да свиете max(eventtime) в рекурсивната заявка, вместо да го правите извън тази заявка, но ако е така, не съм го намерил.
Това се нуждае от индекс на (eventtype, eventtime), за да бъде ефективно. Можете да го накарате да бъде DESC в eventtime, но това не е необходимо. Това е ефективно само ако eventtype има само няколко отделни стойности (21 от тях във вашия случай).