sql >> Base de Datos >  >> RDS >> PostgreSQL

Grupo lento de Postgres por consulta con max

Lo que necesita es un "escaneo de omisión" o "escaneo de índice suelto ". El planificador de PostgreSQL aún no los implementa automáticamente, pero puede engañarlo para que use uno usando una consulta recursiva.

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;

Puede haber una manera de colapsar el máximo (tiempo de evento) en la consulta recursiva en lugar de hacerlo fuera de esa consulta, pero si es así, no lo he encontrado.

Esto necesita un índice en (tipo de evento, hora del evento) para ser eficiente. Puede hacer que sea DESC en el momento del evento, pero eso no es necesario. Esto es eficiente solo si eventtype tiene solo unos pocos valores distintos (21 de ellos, en su caso).