Co potřebujete, je "přeskočit skenování" nebo "uvolněný index skenování ". Plánovač PostgreSQL je zatím neimplementuje automaticky, ale můžete jej oklamat, aby je použil pomocí rekurzivního dotazu."
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;
Může existovat způsob, jak sbalit max(eventtime) do rekurzivního dotazu spíše než to udělat mimo tento dotaz, ale pokud ano, nenarazil jsem na to.
Aby to bylo efektivní, potřebuje index na (typ události, čas události). Můžete mít DESC v čase události, ale to není nutné. To je efektivní pouze v případě, že eventtype má pouze několik různých hodnot (ve vašem případě jich je 21).