PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres Slow group by query mit max

Was Sie brauchen, ist ein "Skip Scan" oder "Loose-Index-Scan ". Der Planer von PostgreSQL implementiert diese noch nicht automatisch, aber Sie können ihn dazu bringen, einen zu verwenden, indem Sie eine rekursive Abfrage verwenden.

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;

Es kann eine Möglichkeit geben, max(eventtime) in die rekursive Abfrage zu reduzieren, anstatt es außerhalb dieser Abfrage zu tun, aber wenn ja, bin ich nicht darauf gestoßen.

Dies benötigt einen Index für (eventtype, eventtime), um effizient zu sein. Sie können es zur Ereigniszeit DESC haben, aber das ist nicht notwendig. Dies ist nur dann effizient, wenn eventtype nur wenige eindeutige Werte hat (in Ihrem Fall 21).