sql >> Databáze >  >> RDS >> PostgreSQL

Postgres Pomalá skupina podle dotazu s max

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).



  1. Jak vybrat vnořený JSON v SQL Server s OPENJSON

  2. CHYBA:další data za posledním očekávaným sloupcem při použití PostgreSQL COPY

  3. Získejte ID každého příkazu INSERT ve více dotazech

  4. MYSQL včetně hodnot pro data s nulovým počtem položek